[2007年NOIP普及组] 纪念品分组
[2007年NOIP普及组] 纪念品分组
- 分析:根据题意,需要给纪念品分组,有几个限定条件,每组纪念品不能大于两个,纪念品价格相加之和不能超过上限,所以,先给纪念品的价格排个序,设两个变量,分别指向最左边的纪念品和最右边的纪念品,最左边和最右边相加,如果价格超过上限,就将指向最右边的变量往前移,同时分组数量+1(也就是自成一组,毕竟他跟价格最低的相加都超过上限),如果两者相加没有超过上限,那么他们两个成一组,指向左边和右边的变量同时往中间移一位。
-
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[30001];
int main()
{
int w,n,sum=0;
cin>>w>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);//排序
int i=1,j=n;
while(i<=j)
{
if(a[i]+a[j]>w)//大于上限
{
j--;//单独输出最大的
sum++;
}
else if(a[i]+a[j]<=w)//符合题意
{
i++;//两两一组
j--;
sum++;
}
}
cout<<sum;
return 0;
}

浙公网安备 33010602011771号