纪念品分组

纪念品分组

难题不会做,只能来做这种简单题
当年看起来无比难的题现在竟然如此简单了
希望有一天能够看现在的难题也很简单吧.

  • 贪心
  • 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\)的最大元素.
posted @ 2018-07-13 20:43  昤昽  阅读(102)  评论(0编辑  收藏  举报