poj 3190Stall Reservations

题意:告诉每头奶牛指定挤奶的时间区间,每台机器只能给一头奶牛挤奶,问最少需要几台机器,并且输出每头奶牛的机器编号

思路:利用优先队列,之前看过一个题目,告诉几段工作时间,在指定时间内问最多能做几件工作,那题思路是取结束时间早的,比赛的时候以为这题也是那样,后来发现不是同一个问题额,自己代码实现不了委屈。。。先按开始时间从早到晚排序,如果相同的话就按结束时间从早到晚排序,判断每次是否有已经挤奶完成的机器,有则使用,没有就再开始新的一台。


#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 50019
using namespace std;

struct Node
{
    int st,en;//开始结束时间
    int s,id;//当前机器和牛的编号
    bool operator <(const Node &a)const
    {
        if(en==a.en)
        return st>a.st;
        return a.en<en;
    }
}node[N];
priority_queue<Node>q;
int a[N];//存储奶牛使用的机器编号
bool cmp(Node a,Node b)
{
    if(a.st==b.st)//如果开始时间相同,则返回结束时间早的
    return a.en<b.en;
    return a.st<b.st;
}

int main()
{
   int n;
   while(~scanf("%d",&n))
   {
       for(int i=1;i<=n;i++)
       {
           scanf("%d%d",&node[i].st,&node[i].en);
           node[i].id=i;
       }
       sort(node+1,node+1+n,cmp);
       node[0].s=1;//开始机器编号为1
       node[0].en=0;
       q.push(node[0]);

       int num=2;//记录使用机器的数量
       for(int i=1;i<=n;i++)
       {
           Node c=q.top();
           if(node[i].st>c.en)
           {
               q.pop();
               node[i].s=c.s;
               a[node[i].id]=c.s;
               q.push(node[i]);
           }
           else
           {
               node[i].s=num;
               a[node[i].id]=num++;
               q.push(node[i]);
           }
       }
       printf("%d\n",num-1);
       for(int i=1;i<=n;i++)
       printf("%d\n",a[i]);
   }
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值