标签:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4434 | Accepted: 1588 | Special Judge |
Description
Input
Output
Sample Input
5 1 10 2 4 3 6 5 8 4 7
Sample Output
4 1 2 3 2 4
Hint
Time 1 2 3 4 5 6 7 8 9 10Other outputs using the same number of stalls are possible.
Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>
Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..
Stall 3 .. .. c3>>>>>>>>> .. .. .. ..
Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
这个题是说一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作。给你每头奶牛的指定时间的区间,问你最小需要多少机器。
先按奶牛要求的时间起始点进行从小到大排序,然后维护一个优先队列,里面以已经开始挤奶的奶牛的结束时间早为优先。然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 const int maxn=60000; 8 int n,use[maxn]; 9 struct Node 10 { 11 int l; 12 int r; 13 int pos; 14 bool operator <(const Node &a)const 15 { 16 if(r==a.r) 17 return l>a.l; 18 return r>a.r; 19 } 20 }a[maxn]; 21 priority_queue<Node> q; 22 bool cmp(Node a,Node b) 23 { 24 if(a.l==b.l) 25 return a.r<b.r; 26 return a.l<b.l; 27 } 28 int main() 29 { 30 while(scanf("%d",&n)!=EOF) 31 { 32 for(int i=0;i<n;i++) 33 { 34 scanf("%d%d",&a[i].l,&a[i].r); 35 a[i].pos=i; 36 } 37 sort(a,a+n,cmp); 38 q.push(a[0]); 39 int now=0,ans=1; 40 use[a[0].pos]=1; 41 for(int i=1;i<n;i++) 42 { 43 if(!q.empty()&&q.top().r<a[i].l) 44 { 45 use[a[i].pos]=use[q.top().pos]; 46 q.pop(); 47 } 48 else 49 { 50 ans++; 51 use[a[i].pos]=ans; 52 } 53 q.push(a[i]); 54 } 55 printf("%d\n",ans); 56 for(int i=0;i<n;i++) 57 printf("%d\n",use[i]); 58 while(!q.empty()) 59 q.pop(); 60 } 61 return 0; 62 }
TLE CODE:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 struct node 7 { 8 int x1,x2; 9 int num; 10 }a[50000+10]; 11 bool cmp(node a,node b) 12 { 13 if(a.x1==b.x1) 14 return a.x2<b.x2; 15 return a.x1<b.x1; 16 } 17 bool vis[50000+10]; 18 int pos[50000+10]; 19 int n; 20 int search(int m) 21 { 22 int l=0,r=n-1,mid,k=-1; 23 while(l<=r) 24 { 25 mid=(l+r)/2; 26 if(a[mid].x1>=m) 27 { 28 29 k=mid; 30 r=mid-1; 31 } 32 else 33 l=mid+1; 34 } 35 return k; 36 } 37 int main() 38 { 39 int i,j; 40 freopen("in.txt","r",stdin); 41 while(scanf("%d",&n)!=EOF) 42 { 43 int count=0; 44 memset(vis,0,sizeof(vis)); 45 fill(pos,pos+n,0); 46 for(i=0;i<n;i++) 47 { 48 scanf("%d%d",&a[i].x1,&a[i].x2); 49 a[i].num=i; 50 } 51 sort(a,a+n,cmp); 52 int last,coun=0,p; 53 for(i=0;i<n;i++) 54 { 55 if(vis[i]) 56 continue; 57 last=a[i].x2+1; 58 vis[i]=1; 59 pos[a[i].num]=++coun; 60 while(1) 61 { 62 p=search(last); 63 if(p==-1) 64 break; 65 if(vis[p]) 66 last=a[p].x1+1; 67 else 68 { 69 last=a[p].x2+1; 70 vis[p]=1; 71 pos[a[p].num]=coun; 72 } 73 } 74 } 75 printf("%d\n",coun); 76 for(i=0;i<n;i++) 77 printf("%d\n",pos[i]); 78 } 79 }
Stall Reservations(POJ 3190 贪心+优先队列)
标签:
原文地址:http://www.cnblogs.com/a1225234/p/5165864.html