题解 P2859 【[USACO06FEB]摊位预订Stall Reservations】
题目链接:
思路:
首先大家会想到这是典型的贪心,类似区间覆盖问题的思路,我们要将每段时间的左端点从小到大排序,然后一个个插入,插入时比较是否先前的牛棚中已经有牛挤完了奶,如果没有就新增一个牛棚,否则用挤完奶的牛棚。
如果插入时扫描一遍找可用的牛棚的话肯定是会超时的,那么我们就要用一个priority_queue(当然你手写堆也可以)维护先前插入的牛棚中最早挤完奶,即右端点最小的那个。
Tips:
注意排序后奶牛的顺序可能是混乱的,而输出是要按原来输入的顺序。我们可以用一个index记录每头奶牛先前的数组下标,以便在记录摊位位置时不会出错。
如何判断每头奶牛在哪个摊位???
- 虽然感觉第一篇题解的二分+树状数组好神奇但是我看不懂
- 感觉第三篇的差分好神奇但我还是看不懂
于是就用了土方法
我们用一个be数组记录每个奶牛对应的摊位,如果前面没有可插入的奶牛,则新增一个。如果前面有一个奶牛挤完了奶,那么我们就用它的牛棚,具体请看代码实现。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <queue>
using namespace std;
const int maxn=50005;
int n,be[maxn],cnt=0;
struct Cow{
int s,e,index;
}cow[maxn];
struct Num{ //优先队列记录下标
int x;
bool operator < (const Num &a) const{
return cow[x].e>cow[a.x].e;
}
};
inline bool cmp1(const Cow &a,const Cow &b){
return a.s<b.s;
}
priority_queue< Num,vector<Num>>poi;
int main()
{
cin>>n;
for(register int i=1;i<=n;i++){
scanf("%d %d",&cow[i].s,&cow[i].e);
cow[i].index=i;
}
sort(cow+1,cow+1+n,cmp1);
for(register int i=1;i<=n;i++){
Num k;k.x=i;
if(!poi.empty()){
Num p=poi.top();//取出队首时间最短的
if(cow[p.x].e>=cow[i].s){
cnt++;
poi.push(k);
be[cow[i].index]=cnt; //注意是index值
}
else {//如果前面有挤完奶的
poi.pop();//注意要pop出来
poi.push(k);
be[cow[i].index]=be[cow[p.x].index]; //注意这句话,仔细想一想为什么
}
}
else {//如果是第一头牛
poi.push(k);
cnt++;
be[cow[i].index]=cnt;
}
}
cout<<cnt<<endl;
for(register int i=1;i<=n;i++){
printf("%d\n",be[i]);
}
return 0;
}
总结:
思维难度一般,考验一些小技巧的使用
题解 P2859 【[USACO06FEB]摊位预订Stall Reservations】的更多相关文章
- bzoj1651 / P2859 [USACO06FEB]摊位预订Stall Reservations
P2859 [USACO06FEB]摊位预订Stall Reservations 维护一个按右端点从小到大的优先队列 蓝后把数据按左端点从小到大排序,顺序枚举. 每次把比右端点比枚举线段左端点小的数据 ...
- 洛谷P2859 [USACO06FEB]摊位预订Stall Reservations
P2859 [USACO06FEB]摊位预订Stall Reservations 题目描述 Oh those picky N (1 <= N <= 50,000) cows! They a ...
- [USACO06FEB]摊位预订Stall Reservations(贪心)
[USACO06FEB]摊位预订Stall Reservations 题目描述 Oh those picky N (1 <= N <= 50,000) cows! They are so ...
- [USACO06FEB] Stall Reservations 贪心
[USACO06FEB] Stall Reservations 贪心 \(n\)头牛,每头牛占用时间区间\([l_i,r_i]\),一个牛棚每个时间点只能被一头牛占用,问最少新建多少个牛棚,并且每头牛 ...
- BZOJ1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 509 Sol ...
- BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
题目 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 553 ...
- 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 566 Sol ...
- POJ 3190 Stall Reservations (优先队列)C++
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7646 Accepted: 271 ...
- Stall Reservations POJ - 3190 (贪心+优先队列)
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11002 Accepted: 38 ...
随机推荐
- shapefile 输出的地理处理注意事项
多年来,ESRI 为存储地理信息开发了三种主要数据格式 - coverage 格式.shapefile 格式及地理数据库格式.其中,所开发的 Shapefile 为存储地理及属性信息提供了一种简单的非 ...
- 阿里云Ubuntu 16 FTP安装配置注意事项
1. 开放端口设置 阿里云控制台添加"安全组规则". 1) 21: FTP端口; 2) 15000~15100: 对应vsftpd.conf 自定义配置. (重要!) pasv_e ...
- 1.2 位于Shell脚本第一行的#!
学习<shell脚本学习指南>一书,记录总结,便于自己回忆,希望对你有帮助! 2.4 自给自足的脚本:位于第一行的 #! 1.Shell脚本执行过程 当Shell执行一个程序时,会要求UN ...
- linux设备树中如何删除某个节点?
答:使用以下语法即可删除某节点: /delete-node/ 节点名;
- debian上搭建私有docker仓库
docker官方仓库是docker hub.虽然很好用,但是无法满足私密性的要求. 如果只需要在局域网内或者朋友圈内分享各自制作的image,那么,搭建属于自己的docker仓库变得很有必要. 一.环 ...
- *Scala API - 并发编程
- CetOS 服务不支持 chkconfig 的解决方法
今天在添加Elasticsearch系统自动启动服务的时候,提示 “服务 elasticsearch 不支持 chkconfig ”,如下图: 后来查找了下原因,是脚本编写的不符合规范,缺少关键的前三 ...
- BUGKU (Mountain climbing)
UPX壳,手脱后打不开,可能是在windows10脱壳的缘故吧.放在XP虚拟机上手脱可能会好,但是提示缺少dll.无奈,智能用工具了. 用的这个,感觉蛮好用的. 先打开程序.随便输入一个数,提示err ...
- D3画完整柱状图(带坐标轴、标签)
昨天晚上本来打算花一点时间把之前学的柱状图改一下,用CSV文件来替换自定义数据.这一替换可不得了,一晚上就搭进去了,还好今早找到了问题的所在,原因在于我的数据引用出了问题. 现在就来讲解一下如何画一个 ...
- Linux文件属性之Linux文件删除重要原理详解
Linux下文件删除的原理 只要dongdaxiafile(源文件).服务进程.dongdaxiaflie_hard_link(硬链接文件)三个中的任意一个存在文件不会被删除.