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
",ans);
return 0;
}