这个题首先,我们需要注意的是它的时间是一秒,其中还包括了你读入数据的时间,因为cin我写的时候没有解除绑定,所以直接超时,我们直接用scanf函数读入50000组数据好了。

然后就是poj交的时候,如果要使用scanf函数和printf函数,就得包括cstdio这个头文件,审查真严格呀。

好了,我们来说说这题吧, 这是一道优先队列加上贪心的题目,主要是贪心。

我们首先按照奶牛的挤奶需求,把它们的挤奶时间按照挤奶的开始时间,从早到晚的顺序进行排列。然后我们就开始给它们分配畜栏。

我们认定每个奶牛都有一个序号,我们读入的时候,就给它从1到n-1写入它的序号里面。

分配的过程是这样的:

如果畜栏队列为空,我们就给它直接分配一个畜栏,将总共的畜栏序号++,然后把这头奶牛所放入的畜栏序号,就是当今的畜栏总号,填入pos数组,下标是奶牛的编号。

我们修改这个畜栏的结束时间,改成奶牛挤奶的结束时间,畜栏的序号也改成总的畜栏序号,之后压入优先队列。

如果畜栏队列不为空,就说明此时已经分配了畜栏,如果此时最早结束使用的畜栏,它的结束时间早于这头奶牛挤奶的开始时间,那我们就可以把这头奶牛放入这头畜栏。

我们把这个畜栏弹出优先队列,因为下一次压入之后的结束时间就改变了。

我们修改这个畜栏的结束时间为奶牛挤奶的结束时间,畜栏的序号不变。奶牛 i 的pos数组对应的位置修改成畜栏的序号,将畜栏压入优先队列。

如果最早结束的都不能满足的话,我们就重新给它分配一个畜栏,重复之前的队列为空的流程。

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std; struct Cow {
int start,end;
int num;
bool operator < (const Cow &b)const {
return start<b.start;
}
}cow[50050];
int pos[50050]; struct Stall {
int end;
int num;
bool operator < (const Stall &b)const {
return end>b.end;
}
Stall(int a,int b):end(a),num(b){}
}; int main()
{
int n;
scanf("%d",&n);
for (int i=0;i<n;i++) {
scanf("%d%d",&cow[i].start,&cow[i].end);
cow[i].num=i;
}
sort(cow,cow+n);
int total=0;
priority_queue<Stall>pq;
for (int i=0;i<n;i++) {
if (pq.empty()) {
total++;
pos[cow[i].num]=total;
pq.push(Stall(cow[i].end,total));
}
else {
Stall st=pq.top();//结束时间最早的畜栏
if (st.end<cow[i].start) {
pq.pop();
pos[cow[i].num]=st.num;
pq.push(Stall(cow[i].end,st.num));
}
else {
total++;
pos[cow[i].num]=total;
pq.push(Stall(cow[i].end,total));
}
}
}
printf("%d\n",total);
for (int i=0;i<n;i++) {
printf("%d\n",pos[i]);
}
return 0;
}

POJ-3190-分配畜栏的更多相关文章

  1. POJ 3190 Stall Reservations贪心

    POJ 3190 Stall Reservations贪心 Description Oh those picky N (1 <= N <= 50,000) cows! They are s ...

  2. POJ 3190 Stall Reservations【贪心】

    POJ 3190 题意: 一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作.给你每头奶牛的指定时间的区间(闭区间),问你最小需要多少机器.思路:先按奶牛要求的时间起始点进行从小到大排序 ...

  3. 【POJ - 3190 】Stall Reservations(贪心+优先队列)

    Stall Reservations 原文是English,这里直接上中文吧 Descriptions: 这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于 ...

  4. POJ -3190 Stall Reservations (贪心+优先队列)

    http://poj.org/problem?id=3190 有n头挑剔的奶牛,只会在一个精确时间挤奶,而一头奶牛需要占用一个畜栏,并且不会和其他奶牛分享,每头奶牛都会有一个开始时间和结束时间,问至少 ...

  5. 【POJ 3190】 Stall Reservations

    [题目链接] http://poj.org/problem?id=3190 [算法] 将这些牛按开始吃草的时间排序 维护一个数组S,Si表示畜栏i进去的最后一头牛结束吃草的时间,对于每头牛,找任意一个 ...

  6. poj 3190 Stall Reservations

    http://poj.org/problem?id=3190 Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Su ...

  7. POJ 3190

    POJ3190                               摊位预订.时间限制:1000MS内存限制:65536K.共提交材料:12959份接受:4 546名特别法官.描述. 哦,那些 ...

  8. Greedy:Stall Reservations(POJ 3190)

    牛挤奶 题目大意:一群牛很挑剔,他们仅在一个时间段内挤奶,而且只能在一个棚里面挤,不能与其他牛共享地方,现在给你一群牛,问你如果要全部牛都挤奶,至少需要多少牛棚? 这一题如果把时间区间去掉,那就变成装 ...

  9. poj 3190 Stall Reservations 贪心 + 优先队列

    题意:给定N头奶牛,每头牛有固定的时间[a,b]让农夫去挤牛奶,农夫也只能在对应区间对指定奶牛进行挤奶, 求最少要多少个奶牛棚,使得在每个棚内的奶牛的挤奶时间不冲突. 思路:1.第一个想法就是贪心,对 ...

  10. Stall Reservations(POJ 3190 贪心+优先队列)

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 158 ...

随机推荐

  1. 洛谷 - P1142 - 轰炸 - 计算几何

    https://www.luogu.org/problemnew/show/P1142 枚举一个基点,枚举另一个点找出斜率,约分后存入.记得要加上那个点本身. __gcd(x,y),返回值符号与y的符 ...

  2. lightoj1200 【完全背包】

    题意: 有一个能放W重的袋子,然后妻子给了老公一列清单,每个item会有价格,数量,重量. 首先得满足老婆的要求,然后在可装的地方输出最大还能拿多少使得拿的东西的钱最多. 注意标题是thief,我想大 ...

  3. bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】

    一个炸弹炸一个区间的武器,想到二分图匹配 但是直接dfs断点显然不行,预处理出dis[i]为i到m的至多值来最优性剪枝,并且标记ok[i][j]为炸弹i可以炸到j武器,mx[i][j]为i炸弹从j武器 ...

  4. P5165 xtq的棋盘

    传送门 设\(f[i]\)为\(i\)位置向左走一步的期望时间,那么答案就是\(\sum_{i=1}^mf[i]\) 首先\(f[n]=1\),设\(p\)为向左的概率,对于\(i<n\)的位置 ...

  5. 洛谷P3537 [POI2012]SZA-Cloakroom(背包)

    传送门 蠢了……还以为背包只能用来维护方案数呢……没想到背包这么神奇…… 我们用$dp[i]$表示当$c$的和为$i$时,所有的方案中使得最小的$b$最大时最小的$b$是多少 然后把所有的点按照$a$ ...

  6. pyrcharm 编程规范

    正常变量赋值, 等号左右各一个空格: 参数赋值, 等号左右都没有空格: 注释#后面一个空格 类定义和函数定义,前后各两行,而在类的里面定义成员函数,只需要空一行 文件最后一个空行 变量.函数.类最好都 ...

  7. byte的范围-128-127

    01111111  表示的是最大的数字 是127这个没有问题  ,前面的0 表示的正数,1表示的负数 而负数在计算机中的存储都是通过补码的形式存在的,也就是说 1 1111 111 是计算机中最小的数 ...

  8. 目标&计划

    目标 感觉起来NOIP还是能考到一个比较好的分数的吧 550+? 现在可能还不大行,但是过3个月或许还是能考到的 所以先订下NOIP保底500争取550+吧 至于省选... 前面有一群巨佬挡着,感觉想 ...

  9. 520 Detect Capital 检测大写字母

    给定一个单词,你需要判断单词的大写使用是否正确.我们定义,在以下情况时,单词的大写用法是正确的:    全部字母都是大写,比如"USA".    单词中所有字母都不是大写,比如&q ...

  10. archsummit_bj2014

    http://bj2014.archsummit.com/schedule.html 大会日程 时间 2014年12月19日 会议室 二号会议厅 7:45 入场注册 8:45 开场致辞 9:30 论高 ...