纪念品分组
纪念品分组
难题不会做,只能来做这种简单题
当年看起来无比难的题现在竟然如此简单了
希望有一天能够看现在的难题也很简单吧.
- 贪心
- front 指向最前,rear 指向最后,如果 p[front]+p[rear] \(\leq\) w,则归到一组,否则 p[front] 单独一组
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=3e4+5;
int p[MAXN];
int main()
{
int w,n;
scanf("%d",&w);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&p[i]);
sort(p+1,p+n+1);
int cnt=0,front=1,rear=n;
while(front<=rear){
if(front==rear){
cnt++;
break;
}
if(p[front]+p[rear]<=w){
cnt++;
front++;rear--;
}
else{
cnt++;
rear--;
}
}
printf("%d",cnt);
return 0;
}
这个贪心的过程可以那么理解 : 考虑现在最小的元素 $ i $ , 和他能够在一个组中的应该是满足 j \(\leq\) $ w-i $ 的最大元素,这样才能 "尽最大可能地利用空间"
虽然以上分析没有问题,但今天放假时因为太无聊我又想到了一个问题,为什么不可以是按照这样的方式贪心 :
- 考虑当前最大元素 $ j$,与 $ j$在一个分组里的应是满足 $ i $ \(\leq\) \(w-j\)的最大元素.