【正经题解】纪念品分组
2024-02-20 18:05:48
发布于:浙江
6阅读
0回复
0点赞
读入之后先用sort排序,然后用两个指针一起向中间走,每次选择都尽可能的让当前状态下最大的和最小的分在一组,如果不行就最大的单独分一组,这样贪心下来就是最少分的组了。证明如下:
如果最大的a[r]不与最小的a[l]分在一组,而是a[r]与a[i]在一组,a[l]与a[j]在一组,因为a[l]<=a[i]&&a[r]>=a[j],所以交换两者分组不影响后续选择,而a[r]如果不能与a[l]在一组,因为a[l]为当前最小值,所以a[r]只能单独为一组,所以贪心是 正确的。
#include<bits/stdc++.h>
using namespace std;
int W,ans=0;
int n,a[30001];
int l,r,i;
int main()
{
scanf("%d%d",&W,&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
l=1; r=n;
while(l<=r)//一定要有等号。
{
if(a[l]+a[r]<=W) //一定要有等号。
l++,r--,ans++;
else
r--,ans++; //贪心过程
}
printf("%d",ans);
return 0;
}
这里空空如也
有帮助,赞一个