- 總時間限制:
- 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 }