4144:畜栏保留问题(贪心算法)
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
农场有N头牛,每头牛会在一个特定的时间区间[A, B](包括A和B)在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求,并要求给出每头牛被安排的方案。对于多种可行方案,主要输出一种即可。
- 输入
- 输入的第一行包含一个整数N(1 ≤ N ≤ 50, 000),表示有N牛头;接下来N行每行包含两个数,分别表示这头牛的挤奶时间[Ai, Bi](1 ≤ A≤ B ≤ 1, 000, 000)。
- 输出
- 输出的第一行包含一个整数,表示最少需要的畜栏数;接下来N行,第i+1行描述了第i头牛所被分配的畜栏编号(从1开始)。
- 样例输入
-
5 1 10 2 4 3 6 5 8 4 7
- 样例输出
-
4 1 2 3 2 4
- 来源
- http://poj.org/problem?id=31
-
-
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define MAXN 50005 4 struct Node { 5 int left,right,id; 6 } a[MAXN]; 7 int use[MAXN]; 8 bool operator < (const Node &a,const Node &b){ 9 return a.right>b.right; 10 } 11 bool cmp(Node a,Node b){ 12 return a.left<b.left; 13 } 14 priority_queue <Node> q; 15 int main() { 16 int n,c,y,ans=0; 17 cin>>n; 18 for(int i=0; i<n; i++) { 19 cin>>a[i].left>>a[i].right; 20 a[i].id=i; 21 } 22 sort(a,a+n,cmp); 23 for(int i=0;i<n;i++){ 24 if(!q.empty()&&q.top().right<a[i].left){ 25 use[a[i].id]=use[q.top().id]; 26 q.pop(); 27 } 28 else { 29 ans++; 30 use[a[i].id]=ans; 31 } 32 q.push(a[i]); 33 } 34 cout<<ans<<endl; 35 for(int i=0;i<n;i++){ 36 cout<<use[i]<<endl; 37 } 38 return 0; 39 }
越努力越幸运