题目链接
实现方法
本题为简单的贪心问题。
- 将所有纪念品价值排序;
- 使用双指针判断最大和最小的价值之和是否小于上限,若小于上限则取两个,否则取价值较大的一个物品;
- 记录未分组的纪念品数量,若数量为0则跳出循环;
代码
#include <bits/stdc++.h>
using namespace std;
signed main() {
int n,w;
cin>>w>>n;
vector<int>v;
for(int i=0;i<n;i++){
int a;
cin>>a;
v.push_back(a);
}
sort(v.begin(),v.end());
int l=0,r=v.size()-1,res=0,cnt=v.size();
while(cnt>0){
if(v[l]+v[r]<=w){
r--;
l++;
cnt-=2;
}
else{
r--;
cnt-=1;
}
res++;
}
cout<<res;
return 0;
}