POJ-3190-Stall Reservations

来源:互联网 发布:淘宝上的哑铃凳哪个好 编辑:程序博客网 时间:2024/05/16 19:38

这个题是说一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作。给你每头奶牛的指定时间的区间,问你最小需要多少机器。

思路:

最开始想的是以奶牛要求时间的结束点从小到大进行排序,但后来发现这样的想法是错误的。后来经过调整,应该先按奶牛要求的时间起始点进行从小到大排序,然后维护一个优先队列,里面以已经开始挤奶的奶牛的结束时间早为优先。然后每次只需要检查当前是否有奶牛的挤奶工作已经完成的机器即可,若有,则换那台机器进行工作。若没有,则加一台新的机器。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int maxn=60000;int n,use[maxn];struct Node{    int l;    int r;    int pos;    bool operator <(const Node &a)const     {if(r==a.r)    return l>a.l;return r>a.r;    }}a[maxn];priority_queue<Node> q;bool cmp(Node a,Node b){    if(a.l==b.l)return a.r<b.r;    return a.l<b.l;}int main(){    while(scanf("%d",&n)!=EOF)    {for(int i=0;i<n;i++){    scanf("%d%d",&a[i].l,&a[i].r);    a[i].pos=i;}sort(a,a+n,cmp);q.push(a[0]);int now=0,ans=1;use[a[0].pos]=1;for(int i=1;i<n;i++){    if(!q.empty()&&q.top().r<a[i].l)    {use[a[i].pos]=use[q.top().pos];q.pop();    }    else    {ans++;use[a[i].pos]=ans;    }    q.push(a[i]);}printf("%d\n",ans);for(int i=0;i<n;i++)    printf("%d\n",use[i]);while(!q.empty())    q.pop();    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不喜欢吃水果蔬菜怎么办 小孩不喜欢吃水果怎么办 校长想整老师怎么办 和老师吵架了怎么办 孩子初中转学学籍怎么办 孩子上初中学籍怎么办 18孩子不想上学怎么办 宝宝不爱吃蔬菜怎么办 孩子总丢东西怎么办 孩子经常丢东西怎么办 孩子总是丢东西怎么办 孩子负能量太多怎么办 不要孩子老了怎么办 父母都内向孩子怎么办 孩子不喜欢读课外书怎么办 学习学不进去怎么办 小孩停不下来怎么办 小孩老爱玩不爱学习怎么办 小孩子不喜欢吃菜怎么办 孩子初中不爱学习怎么办 大学不爱学家长怎么办 小孩子不爱读书不听话怎么办 小孩不爱读书写字怎么办 一年级学生不爱学习怎么办 孩子练字怕累怎么办 孩子不愿意学英语怎么办 生了儿子 不喜欢 怎么办 养两个儿子的怎么办 看诗词记不住怎么办 经常读书记不住怎么办 孩子不爱记数字怎么办 考研学不进去怎么办 读了职高后悔怎么办 不喜欢看书的人怎么办 生的儿子不喜欢怎么办 孩子上网不回家怎么办 儿子不想读书了怎么办 中考体育考不好怎么办 小孩突然没礼貌怎么办 小孩读书记忆差怎么办 这几天不爱吃饭怎么办