1042: [贪心] 纪念品分组
题目描述
元旦快到了,校学生会让三胖负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,三胖希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入
第1行包括一个整数w,为每组纪念品价格之和的上限= 第2行为一个整数n,表示购来的纪念品的总件数G
第3-n+2行每行包含一个正整数Pi (5 <= Pi <= w3)w表示所对应纪念品的价格。
输出
仅1行,包含一个整数, ep最少的分组数目合
样例输入
100
9
90
20
20
30
50
60
70
80
90
样例输出
6
题目解析:
这是一道简单的关于贪心算法的题,思路很简单,为了尽量的选最合适的作为一组,我们把这些数据排序后,从最小的和最大的开始一次判断,如果加起来不超过上限,则把他们组合在一组,若超过了,再进行下一轮判断。只要合并一次,就记录下次数,最后再将那些无法和别的组成一组的数据的个数也加上,就可以解决了。
代码(已通过)
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int x,n,i,j,s=0;//x记录上限,n记录总数,s记录可分成的组//
cin>>x;//输入上限//
cin>>n;//输入总数//
int a[n];
for(i=0;i<n;i++)
cin>>a[i];//输入各个数据//
sort(a,a+n);//使用sort函数进行排序//
for(i=0;i<n;i++){
for(j=n-1;j>i;j--){//遍历循环//
if(a[i]+a[j]<=x&&a[i]!=0&&a[j]!=0)//如果两个组队后之和未超过上限,则将他们组合到一起//
{
s+=1;
a[i]=0;
a[j]=0;
break;//s+1,且将这两个数清0//
}
}
}
for(i=0;i<n;i++)//遍历循环,寻找未清0的数,让他们单独组成一组//
if(a[i]!=0)
s+=1;
cout<<s;
return 0;
}