纪念品分组
思路:
首先看明白题意,题目要求我们在N个物品中分出最小数目的二元组,且任意二元组的value不能超过定值 M。
第一次见这种题可能会有点懵,但我们仔细想一下,就会发现这其实是个很明显的贪心。我们采取的贪心策略是:对于每组来说,我们先放一个当前最小value的物品,如果它的价值再加上当前最大value的物品,未超过M,则这是最优方案;否则,我们就单独把最大value的物品分一组,消耗掉它。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define INF 0x3f3f3f3f
#define N 30000 + 10
using namespace std;
ll maxx,now,n,a[N],l,r,ans;
int main()
{
ios::sync_with_stdio(false);
cin >> maxx >> n;
l = 1,r = n;
for(int i = 1;i <= n;++i)
{
cin >> a[i];
}
sort(a + 1,a + 1 + n);
while(l <= r)
{
if(a[l] + a[r] <= maxx)
{
++ans;
++l,--r;
}
else
{
--r;
++ans;
}
}
cout << ans << endl;
return 0;
}