题意
为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。
思路
排序,然后贪心,第一个数 i 与最后一个数 j 相加,如小于等于给定的整数则 i 进一,j 减一(这两个为一组),继续重复进行判断,如果大于W则 j 减一,i 不变(j 自为一组)。 到最后如果 i == j 自为一组。
code
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int W;
int n;
int a[30005];
int sum=0;
cin>>W;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int i=0;
int j=n-1;
while(i<=j)
{
if(a[i]+a[j]<=W)
{
i++;
j--;
sum++;
}
else
{
if(a[j]>W)
{
j--;
continue;
}
else if(a[j]<=W)
{
j--;
sum++;
}
}
}
cout<<sum<<endl;
return 0;
}