• 题目链接:

    https://www.luogu.org/problemnew/show/P2859

  • 思路:

    • 首先大家会想到这是典型的贪心,类似区间覆盖问题的思路,我们要将每段时间的左端点从小到大排序,然后一个个插入,插入时比较是否先前的牛棚中已经有牛挤完了奶,如果没有就新增一个牛棚,否则用挤完奶的牛棚。

    • 如果插入时扫描一遍找可用的牛棚的话肯定是会超时的,那么我们就要用一个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】的更多相关文章

  1. bzoj1651 / P2859 [USACO06FEB]摊位预订Stall Reservations

    P2859 [USACO06FEB]摊位预订Stall Reservations 维护一个按右端点从小到大的优先队列 蓝后把数据按左端点从小到大排序,顺序枚举. 每次把比右端点比枚举线段左端点小的数据 ...

  2. 洛谷P2859 [USACO06FEB]摊位预订Stall Reservations

    P2859 [USACO06FEB]摊位预订Stall Reservations 题目描述 Oh those picky N (1 <= N <= 50,000) cows! They a ...

  3. [USACO06FEB]摊位预订Stall Reservations(贪心)

    [USACO06FEB]摊位预订Stall Reservations 题目描述 Oh those picky N (1 <= N <= 50,000) cows! They are so ...

  4. [USACO06FEB] Stall Reservations 贪心

    [USACO06FEB] Stall Reservations 贪心 \(n\)头牛,每头牛占用时间区间\([l_i,r_i]\),一个牛棚每个时间点只能被一头牛占用,问最少新建多少个牛棚,并且每头牛 ...

  5. BZOJ1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 509  Sol ...

  6. BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    题目 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 553   ...

  7. 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 566  Sol ...

  8. POJ 3190 Stall Reservations (优先队列)C++

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7646   Accepted: 271 ...

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

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11002   Accepted: 38 ...

随机推荐

  1. redis---set类型常用命令

    添加元素:sadd key value1 value2 查看指定key包含的元素:smembers key 判断指定元素是否存在于key的value中(0表示不存在,1表示存在):sismember ...

  2. 7.Mahout菩萨

    1.Maout简介 2.机器学习介绍 3.Mahout算法介绍

  3. k8s应用01-----入门实例

    安装一个单机版的K8S 1.关闭防火墙firewalld2.安装etcd和kubernetesyum install -y etcd kubernetes(会自动安装docker)3.修改配置文件修改 ...

  4. Vue + Webpack-simple 怎么修改生产环境下运行的端口?

    开发环境下运行 npm run dev,默认运行在localhost:8080端口,想要修改端口,于是在"dev“后增加了--port 8081

  5. 在业务控制方法中写入Request,Response等传统web参数

    可以在业务控制方法中书写传统web参数,这种方式我们不提倡,耦合了 @Controller @RequestMapping(value="/user") public class ...

  6. Spring Security登录超时,angular ajax请求出错自动跳转至登录页(jQuery也适用)

    公司开发采用Spring Security+AngualerJS框架,在session过期之后,ajax请求会直接出错.本文介绍如何实现出错情况下自动跳转至登录页. 整体思路是,session过期后, ...

  7. Hadoop集群参数和常用端口

    一.Hadoop集群参数配置 在hadoop集群中,需要配置的文件主要包括四个,分别是core-site.xml.hdfs-site.xml.mapred-site.xml和yarn-site.xml ...

  8. CentOS8 安装 simple-scan 的方法

    CentOS8删除了很多软件包,解决的思路一般是从CentOS7或EPEL7的软件仓库中寻找,并解决依赖关系. 比如找到EPEL7中有 simple-scan 软件包,但安装时发现其又依赖 gnome ...

  9. 深入解析d3弦图

    记得上次看d3应该是1年前的事情了,当时还一边看一边写了d3(v5.7)的一个学习笔记:https://www.cnblogs.com/eco-just/tag/d3/ 后来转战three.js就没继 ...

  10. 【VS开发】组播(多播)的C程序实战

    每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂. 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不 ...