题目描述
元旦快到了,校学生会让图图负责新年晚会的礼物发放工作。为使得参加晚会的同学所获得的礼物价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件礼物,并且每组礼物的价格之和不能超过一个给定的整数。为了保证在尽量短的时 间内发完所有礼物,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入
输入包含n+2行:
第1行包括一个整数w,为每组礼物价格之和的上限。
第2行为一个整数n,表示购来的礼物的总件数。
第3~n+2行每行包含一个正整数pi (5 < = pi < = w),表示所对应礼物的价格。
输出
输出仅一行,包含一个整数,即最少的分组数目。
样例输入复制
100 9 90 20 20 30 50 60 70 80 90
样例输出复制
6
提示
50%的数据满足:1 < = n < = 15
100%的数据满足:1 < = n < = 30000, 80 < = w < = 200
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int w, n;
vector<int> a;
bool cmp(int i, int b)
{
return i > b;
}
int main()
{
cin >> w >> n;
int t;
int sum = 0;
for (int i = 0; i < n; ++i)
{
cin >> t;
a.push_back(t);
}
sort(a.begin(), a.end(), cmp);
int f = 0, l = n - 1;
while (f <= l)
{
if (a[f] + a[l] <= w)
{
f++;
l--;
sum++;
} else
{
sum++;
f++;
}
}
cout << sum << endl;
return 0;
}