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

题目是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,即为从大到小


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值