【USACO 2006 February Silver】产奶安排Stall Reservations-贪心

Descriptions:

这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于必须在[A,B ]的时间内产奶(1 <= A <= B <= 1,000,000)当然, FJ必须为他们创造一个决定挤奶时间的系统.当然,没有牛想与其他奶牛分享这一时光

帮助FJ做以下事:
使每只牛都有专属时间的最小牛棚数
每只牛在哪个牛棚
也许有很多可行解。输出一种即可,采用SPJ

Input

第一行一个数字 N

第 2..N+1行: 第 i+1行 描述了i号奶牛挤奶的起止时间

Output

第一行:牛棚最小数量

Lines 2..N+1: 第 i+1行 描述了i奶牛被安排的牛棚

Sample Input

5
1 10
2 4
3 6
5 8
4 7

Sample Output

4
1
2
3
2
4


总结

  • 贪心题,算法竞赛上有讲,按照开始时间由小到大排序即可
  • 不会改小根堆,默认大根堆,所以插入负数,算法竞赛上最后一节有讲
  • 貌似还能用set,线段树,优先对列做?

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#define maxn 50005
using namespace std;
priority_queue<int> q;
int n,ans=1;
struct fdfdfd{int a,b;}e[maxn];
bool cmp(fdfdfd x,fdfdfd y){return x.a<y.a;}
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d%d",&e[i].a,&e[i].b);
	sort(e+1,e+n+1,cmp);
	q.push(-e[1].b);
	for(int i=2;i<=n;++i)
	{
		int minn=q.top();
		if(minn<=-e[i].a) ++ans,q.push(-e[i].b);
		else q.pop(),q.push(-e[i].b);
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2020-10-05 20:50  wuwendongxi  阅读(147)  评论(0编辑  收藏  举报