AcWing 430. 纪念品分组
原题链接
简单
作者:
不幸到吃土
,
2025-01-01 21:37:05
,
所有人可见
,
阅读 1
/*
考虑先将原序列排序,然后大胆贪心!
贪心思想:每次给当前物品找一个价值尽可能大的且总价值没有超过上限的"同伴物品",将两个物品分在一组
故设指针i、j分别指向序列的首、尾,若w[i] + w[j] > limit,则不断进行j--
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30010;
int a[N]; //存储每个物品的权重
bool st[N];
int main(){
int w,n;
cin >> w >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
sort(a,a+n);
int res = 0;
for(int i=0,j=n-1;i<n;i++){
if(st[i]) continue;
while(j >= i && (st[j] || a[i] + a[j] > w)) j--;
st[i] = st[j] = true;
res++;
}
cout << res << endl;
return 0;
}