POJ 3190 Stall Reservations(贪心—区间问题+优先队列维护)

题意:一群很有个性的奶牛,只在固定的时间产奶,每头牛需要用一个挤奶机器,问为满足所有牛产奶,最少需要多少个挤奶机器,并按照奶牛给出的顺序来输出该奶牛挤奶机器的编号。

题解:先将奶牛按照开始产奶的时间从小到大排序,若开始时间相同,则按照结束时间从小到大排序。然后用一个优先产奶结束时间的优先队列去维护当前产奶奶牛,若下一个奶牛的开始时间小于或者等于当前奶牛的结束时间,则需要重新使用一个产奶机器,并入队列,若大于当前奶牛的结束时间,则可以同用一个挤奶机器,并更新当前产奶奶牛。

代码如下:

  1. #include<cstdio>  
  2. #include<cstring>  
  3. #include<algorithm>  
  4. #include<queue>  
  5. using namespace std;  
  6. int per[50010];  
  7. struct node  
  8. {  
  9.     int start,end,pos;  
  10. }cow[50010],now;  
  11.   
  12. bool operator < (const node &a,const node &b)//产奶结束越早的越优先   
  13. {  
  14.     if(a.end==b.end)  
  15.         return a.start>b.start;  
  16.     return a.end>b.end;  
  17. }  
  18.   
  19. int cmp(node a,node b)  
  20. {  
  21.     if(a.start==b.start)  
  22.         return a.end<b.end;  
  23.     return a.start<b.start;  
  24. }  
  25.   
  26.   
  27.   
  28. int main()  
  29. {  
  30.     int n,i,k,cnt;  
  31.     while(scanf("%d",&n)!=EOF)  
  32.     {  
  33.         for(i=0;i<n;++i)  
  34.         {  
  35.             scanf("%d%d",&cow[i].start,&cow[i].end);  
  36.             cow[i].pos=i;//记录给出数据时的编号   
  37.         }  
  38.         sort(cow,cow+n,cmp);      
  39.         memset(per,0,sizeof(per));  
  40.         priority_queue<node>q;  
  41.         q.push(cow[0]);  
  42.         per[cow[0].pos]=1;  
  43.         k=1;  
  44.         for(i=1;i<n;++i)  
  45.         {  
  46.             now=q.top();  
  47.             if(cow[i].start>now.end)//同用一个挤奶机器   
  48.             {  
  49.                 per[cow[i].pos]=per[now.pos];  
  50.                 q.pop();  
  51.             }  
  52.             else//增加一个挤奶机器   
  53.                 per[cow[i].pos]=++k;  
  54.             q.push(cow[i]);  
  55.         }  
  56.         printf("%d\n",k);  
  57.         for(i=0;i<n;++i)  
  58.             printf("%d\n",per[i]);  
  59.     }  
  60.     return 0;  
  61. }   


猜你喜欢

转载自blog.csdn.net/yihanyifan/article/details/80100559