题目链接:https://cn.vjudge.net/problem/UVA-11776

题意:

给出数字n(0<=n<=1000),代表有n个农民,接下来有n行,每行两个数字S和E代表这个农民工作时间为[S,E];

每个农民工作时,需要有一个enforcer来监督,且每个enforcer一次只能监督一个农民;

求最少需要多少个enforcer.

题解:

这道题我也不太清楚算贪心还是算模拟,可能两者都有一点吧。

首先我们根据正常思维,既然要模拟分配监工去监督农民,那么肯定先给第一个开始做的农民分配一个监工;

所以我们自然而然的想到对农民按工作时间的起点S从小到大排序;

然后,我们也就会进一步自然的想到,如果下一个农民的工作时间和当前农民的工作时间有重合,就要再来一个监工;

但是,经过更加仔细的思考,

由于我们是按农民工作时间的起点S从小到大排,而非按工作终点E排,故可能出现问题:

3

1 5

2 3

4 10

这种情况,如果单纯地像上面说的那样算,就会算出需要3个监工,而事实上,只需要2个监工就够了。

所以,我们建立一个优先队列,用以存储表示每个监工的监督时间;

并且每个监工有两个变量l和r,表示在当前,监工的工作时间为[l,r],而优先队列按监督时间的终点从小到大维护。

这样一来,我们就有更加成熟的思路:

①把第一个的农民的工作时间[S,E]当做第一个监工的监督时间[l,r]存入优先队列。

②枚举之后的农民;

③获得队头的值(代表了当前所有监工中,最早空下来的那个),与当前农民进行比较:

  若当前监工还未空闲,说明所有监工都没空,只能在加一个监工;

  若当前监工已经空闲,可以监督当前农民,则取出队头,[l,r]修改成当前农民的[S,E]值,再push入优先队列;

④所有农民枚举完毕,ans = 优先队列的size;

AC代码:

 #include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
struct Node{
int l,r;
bool operator<(const Node &oth)const
{
return this->r > oth.r;
}
}node[+];
int n;
bool cmp(Node a,Node b){return a.l<b.l;}
int main()
{
int kase=;
while(scanf("%d",&n) && n!=-)
{
if(n==)
{
printf("Case %d: 0\n",++kase);
continue;
} priority_queue<Node> enforcer;
for(int i=;i<n;i++) scanf("%d%d",&node[i].l,&node[i].r);
sort(node,node+n,cmp);
enforcer.push(node[]);
for(int i=;i<n;i++)
{
Node now=enforcer.top();
if(node[i].l<=now.r) enforcer.push(node[i]);
else
{
enforcer.pop();
now.l=node[i].l, now.r=node[i].r;
enforcer.push(now);
}
} printf("Case %d: %d\n",++kase,enforcer.size());
}
}

UVA 11776 - Oh Your Royal Greediness! - [贪心/模拟]的更多相关文章

  1. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

  2. Uva 11729 Commando War (简单贪心)

    Uva 11729  Commando War (简单贪心) There is a war and it doesn't look very promising for your country. N ...

  3. uva 1153 顾客是上帝(贪心)

    uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...

  4. 贪心+模拟 ZOJ 3829 Known Notation

    题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...

  5. CodeForces ---596B--Wilbur and Array(贪心模拟)

    Wilbur and Array Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Su ...

  6. UVA 10714 Ants 蚂蚁 贪心+模拟 水题

    题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...

  7. UVA 11054 Wine trading in Gergovia 葡萄酒交易 贪心+模拟

    题意:一题街道上很多酒店,交易葡萄酒,正数为卖出葡萄酒,负数为需要葡萄酒,总需求量和总售出量是相等的,从一家店到另外一家店需要路费(路费=距离×运算量),假设每家店线性排列且相邻两店之间距离都是1,求 ...

  8. UVA 311 Packets 贪心+模拟

    题意:有6种箱子,1x1 2x2 3x3 4x4 5x5 6x6,已知每种箱子的数量,要用6x6的箱子把全部箱子都装进去,问需要几个. 一开始以为能箱子套箱子,原来不是... 装箱规则:可以把箱子都看 ...

  9. UVA - 11054 Wine trading in Gergovia (Gergovia 的酒交易)(贪心+模拟)

    题意:直线上有n(2<=n<=100000)个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai(-1000<=ai<=1000),其中ai>0表示买酒 ...

随机推荐

  1. ab压测札记(Apache Bench)

    1 ab安装 ab实际上是apache httpd里面的一个工具或者说子模块,安装apache httpd可以参考另一篇文章JBOSS集群的2.3节 安装目录:/apache目录/bin/,如下 2 ...

  2. SpringMVC由浅入深day01_12.4 pojo绑定_12.5自定义参数绑定实现日期类型绑定_12.6集合类

    12.4 pojo绑定 页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo. 页面定义: controller的pojo形参的定义: 打断点测试 ...

  3. Git Step by Step – (8) Git的merge和rebase

    前面一篇文章中提到了"git pull"等价于"git fetch"加上"git merge",然后还提到了pull命令支持rebase模式 ...

  4. vuejs中使用echart图表

    首先安装echart npm i echarts -S 加下来以使用这个图表为例 在vue组件中像这样使用: <template> <div :class="classNa ...

  5. C++ mysql 乱码

    C++读mysql数据库中的中文显示出来的是乱码 在连接到数据库后加上这么一句 mysql_query(pMYSQL, "SET NAMES GB2312"); 或者 mysql_ ...

  6. iOS开发-- 如何让 UITableView 的 headerView跟随 cell一起滚动

    在我们利用 UITableView 展示我们的内容的时候,我需要在顶部放一个不同于一般的cell的 界面,这个界面比较独特. 1. 所以我就把它 作为一个section的 headerView. 也就 ...

  7. sql语句建表,并且自增加主键

    sql语句建表,并且自增加主键 use [test] CREATE TABLE [dbo].[Table_4] ( [userid] [int] IDENTITY(1,1) NOT NULL, CON ...

  8. IOS多线程之线程的创建

    版权声明:原创作品,谢绝转载!否则将追究法律责任.   之前也说过线程是消耗资源的.多线程会占用你应用程序(和系统的)的内存使用和性能方面的资源.我们创建一个线程后可以对他的一些部分进行配置例如可以对 ...

  9. 【angularjs基础】ng-repeat嵌套循环报错angular.min.js:89 Error: [ngRepeat:dupes]

    再写嵌套循环的时候,提示一个错误 angular.min.js: Error: [ngRepeat:dupes] 代码如下 <table class="GridViewTable mt ...

  10. String例子

    #include <string.h> class String{ public: String(const String& str); String(const char* st ...