难度:普及-
题目类型:贪心
提交次数:1
涉及知识:贪心
题目描述
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入输出格式
输入格式:
输入文件group.in包含n+2行:
第1行包括一个整数w,为每组纪念品价格之和的上上限。
第2行为一个整数n,表示购来的纪念品的总件数G
第3~n+2行每行包含一个正整数Pi (5 <= Pi <= w)w表示所对应纪念品的价格。
输出格式:
输出文件group.out仅一行,包含一个整数,即最少的分组数目。
代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int a[30010]; 5 int w, n; 6 int main(){ 7 int i, j; 8 cin>>w>>n; 9 for(i = 0; i < n; i++) 10 cin>>a[i]; 11 sort(a, a+n); 12 i = 0; 13 j = n-1; 14 int ans = 0; 15 while(i<=j){ 16 if(a[i]+a[j]<=w){ 17 ans++; 18 i++; 19 j--; 20 } 21 else{ 22 ans++; 23 j--; 24 } 25 } 26 cout<<ans; 27 return 0; 28 }
备注:
贪心选择策略是,尽可能把最大的和最小的放在一组,如果超了,就最大的自己为一组。i==j时的情况没想清楚就交了,后来想一想,如果i和j碰上了,就说明中间那个单独为一组,ans也会++,然后i++ j--或者j--,总之会跳出循环,所以没啥毛病。