解题思路:
这道题是要找出最小的组数,不是要求组数最小并且最平均!!!要明确这一点,所以思路就是让尽量多的礼物可以凑成两两一组,肯定不能价格少的和价格少的一组,这样的话后面的价格大的就凑不了了,所以就最好是把价格最小的和价格最大的匹配,如果最大的加上价格最小的会超出的话,那么价格最大的就单独一组,价格最小的就和第二价格大的一组。
看一组例子:
100 9 90 20 20 30 50 60 70 80 90
这个是不是这样来:第一组:90 第二组:90 第三组: 80+20 第四组: 70+20 第五组: 60+30 第六组: 50。 这样六组就出来了。
而我们之所以能实现这样加起来,那就要使用到我们的sort函数了;
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n, k, ans[30005], sum;
int main()
{
cin >> k >> n;
int i, o;
for (i = 0; i < n; ++i) cin >> ans[i];
sort(ans, ans + n);
int t = n - 1;
for (i = 0; i <= t; ++i) {
o = t;
for (; o >= i; --o) {
if (ans[o] + ans[i] <= k) {
++sum;
--t;
break;
}
else if (ans[o] + ans[i] > k) {
++sum;
--t;
--i;
break;
}
}
}
cout << sum;
return 0;
}