热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UVA11776OhYourRoyalGreediness![贪心/模拟]

题目链接:https:cn.vjudge.netproblemUVA-11776题意:给出数字n(0

题目链接: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代码:

 1 #include
 2 #include
 3 #include
 4 using namespace std;
 5 struct Node{
 6     int l,r;
 7     bool operator<(const Node &oth)const
 8     {
 9         return this->r > oth.r;
10     }
11 }node[1000+5];
12 int n;
13 bool cmp(Node a,Node b){return a.l<b.l;}
14 int main()
15 {
16     int kase=0;
17     while(scanf("%d",&n) && n!=-1)
18     {
19         if(n==0)
20         {
21             printf("Case %d: 0\n",++kase);
22             continue;
23         }
24 
25         priority_queue enforcer;
26         for(int i=0;i"%d%d",&node[i].l,&node[i].r);
27         sort(node,node+n,cmp);
28         enforcer.push(node[0]);
29         for(int i=1;i)
30         {
31             Node now=enforcer.top();
32             if(node[i].l<=now.r) enforcer.push(node[i]);
33             else
34             {
35                 enforcer.pop();
36                 now.l=node[i].l, now.r=node[i].r;
37                 enforcer.push(now);
38             }
39         }
40 
41         printf("Case %d: %d\n",++kase,enforcer.size());
42     }
43 }

UVA 11776 - Oh Your Royal Greediness! - [贪心/模拟]


推荐阅读
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 回顾两年前春节期间的一个个人项目,该项目原本计划参加竞赛,但最终作为练习项目完成。独自完成了从编码到UI设计的全部工作,尽管代码量不大,但仍有一定的参考价值。本文将详细介绍该项目的背景、功能及技术实现。 ... [详细]
  • 心理学经典:《思考致富》
    《思考致富》是由美国著名成功学大师拿破仑·希尔撰写的一部重要著作,该书基于希尔长达20年的深入研究和访谈,探讨了个人成功的核心要素。书中不仅揭示了成功的关键,还提供了一系列实用的方法和策略。 ... [详细]
  • 本文将详细介绍如何在二进制和十六进制之间进行准确的转换,并提供实际的代码示例来帮助理解这一过程。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • 1#include2#defineM1000103#defineRGregister4#defineinf0x3f3f3f3f5usingnamespacestd;6boolrev ... [详细]
author-avatar
色花君子fds_181
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有