通过一道贪心学到了优先队列的用法

来源:互联网 发布:淘宝女装前十名网红 编辑:程序博客网 时间:2024/05/18 19:38
题目是POJ3190
#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;struct dd{    int l;    int r;    int ps;    friend bool operator<(struct dd k1,struct dd k2)    {        return k1.r>k2.r;    }}a[50005];typedef struct dd dd;bool cmp(dd a,dd b){ if(a.l==b.l)return a.r>b.r;else  return a.l<b.l;}int a1[50005];int main(){  int i,j,m,n;  while(scanf("%d",&m)!=EOF)  {      int need=1;    for(i=0;i<m;i++)    {      scanf("%d%d",&a[i].l,&a[i].r);      a[i].ps=i;    }    sort(a,a+m,cmp);    priority_queue<dd> q;    q.push(a[0]);    a1[a[0].ps]=1;    for(i=1;i<m;i++)    {      if(a[i].l<=q.top().r)      a1[a[i].ps]=++need;       else            {            a1[a[i].ps]=a1[q.top().ps];                q.pop();            }            q.push(a[i]);        }        printf("%d\n",need);        for(int i=0;i<m;i++)            printf("%d\n",a1[i]);    }    return 0;    }
题目的意思是一些奶牛,他们在固定的时间挤奶,问最少需要几台机器能完成全部的工作。
首先  先对左边的起始时间进行排序号,然后再从右边的时间开始,一一入队,队列使用优先队列,根据右边时间结束短的放队列的头,如果下一个时间比头时间短就入队,然后机器数目+1,如果右端的时间大于等于头时间,有抛弃队首,然后将这个时间入队列。
   priority_queue<int, vector<int>, greater<int> > qi2;//从小到大的优先级队列,可将greater改为less,即为从大到小

0 0