[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;
    }

posted @ 2022-08-16 11:02  4lovls  阅读(53)  评论(0)    收藏  举报