洛谷P1094纪念品分组 题解

题目传送门

首先的思路就是贪心。先将所有的纪念品按照价格从低到高进行排序。在分别从左到右、从右到左合并纪念品。如果两端纪念品价格超过了上上限,那么就将较大的那一个纪念品独自放入。否则将两个纪念品一起放入。

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int ret=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
    while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}//读优
int N,W,w[30005],f[30005],top,ans;
int main()
{
    W=read();N=read();
    for(int i=1;i<=N;i++) w[i]=read();
    //到此为读入
    sort(w+1,w+N+1);//排序
    int l=1,r=N;//初始化l、r坐标
    while(l<=r)
    {
        if(w[l]+w[r]>W) r--;
        else l++,r--;
        ans++;//别忘记加ans
    }
    printf("%d
",ans);//输出
    return 0;
}
博客转载必须注出处!
原文地址:https://www.cnblogs.com/yzx1798106406/p/8652887.html