POJ3190 奶牛挤奶分配位置问题 (优先队列)

传送门:

 

思路: 使用优先队列将当前奶牛开始工作时间与队列首位结束时间比较,如果大于便使用队列首位奶牛的位置并改变队列,否则增加位置改变队列。

注意:输出的位置是对应输入的,因此在排序时需要使用一个pos记录位置。 

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
struct Time
{
  int l;
  int r;
  int pos;
};
Time t[50005];
Time now;

bool operator < (Time a, Time b)
{
    if(a.r == b.r)
        return a.l > b.l;
    return a.r > b.r;
}

bool cmp(Time a, Time b)
{
    if(a.l == b.l)
        return a.r < b.r;
    return a.l < b.l;
}
int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        for(int i = 1; i <= n; i++)
    {
        scanf("%d%d", &t[i].l, &t[i].r);
        t[i].pos = i;
    }
    sort(t+1,t+n+1,cmp);
    priority_queue <Time> q;
    q.push(t[1]);
    int k = 1;
    int s[50005];
    memset(s,0,sizeof s);
    s[t[1].pos] = 1;
    for(int i = 2; i <= n; i++)
    {
        now = q.top();
        if(t[i].l > now.r)
        {
            q.pop();
            q.push(t[i]);
            s[t[i].pos] = s[now.pos];
        }
        else
        {
            q.push(t[i]);
            k++;
            s[t[i].pos] = k;
        }
    }
    printf("%d\n",k);
    for(int i = 1; i <= n; i++)
        printf("%d\n", s[i]);}
    }
    

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值