题意:

小C现在想建设一个国家。这个国家中有一个首都,然后有若干个中间站,还有若干个城市。

现在小C想把国家建造成这样的形状:选若干(可以是0个)的中间站把他们连成一条直线,然后把首都(首都也是一个中间站)连在这一条直线的左端。然后每个点可以连一个城市,特别的是最右端的点可以连接两个城市。

现在有n个城市的规划供小C选择。但是,他们那儿的交通条件比较差,他们那儿一天是2*H个小时,每个城市里面的人每天都会去首都拿一样东西,从他们所在的城市出发,到了首都之后拿了东西就走(拿东西的时间可以忽略不计),他们要在2*H个小时之内返回他们自己的家中(从家中出发到返回家中不超过2*H小时)。

每个城市有两个属性,一个是城市的直径,另外一个是能居住的人口数目。对于第i个城市而言,这两个属性分别是hi,pi。

城市的直径的意思是离这个城市出口最远的人想要出城先要在城里行走的最少的时间。

在首都,中间站,城市之间行走要花费1小时的时间。

小C想选择一些城市然后通过若干的中间站和首都连接起来,在每个人能在2*H小时返回的条件下所有城市居住的总人口数目要最多。

样例解释:最上面的蓝点表示首都,其它的蓝点表示中间站,剩下的红圈表示选择的城市。

Input
单组测试数据。
第一行包含两个整数n 和H (1 ≤ n ≤ 1000,1 ≤ H ≤ 1000000000),表示可供选择的城市数目和时间限制。
接下来n行,每行有两个整数hi, pi (1 ≤ hi ≤ H, 1 ≤ pi ≤ 1000),第i个城市的两个属性,即直径和能容纳人口数。
Output
输出最多能居住的人口数目。
Input示例
5 10
1 1
1 1
2 2
3 3
4 4
Output示例
11

思路:

这道题卡了我两天了,终于在年三十过掉了这题。一开始思路是对的,就是优先队列,但是很多细节处理的不好,需要注意的点很多。
题目说的很啰嗦,要细细理解。之所以时限给的是2*H,是因为考虑到往返程,所以计算路径长度的时候只需要考虑H就可以了。图片中的线段通过的时间都是1,通过中间站不需要时间,每个城市通过的时间都给出来了。能构造出的树的形状已经确定了,那么我们需要考虑的就是树的深度,以及城市位置的安排。
其实把题目条件变换一下,利用总时限H减掉每个城市自己的时限,就得到这个城市到首都的路上所需要的最大时限。很显然,这个路上的时限必须要大于0(这点很关键,我没考虑这个WA了很久),也就是说,这个问题可以化简成,每个任务都有自己的时限和价值,在不超过所选择任务时限的前提下,每个单位时间只能完成一个任务,能获得的最大值是多少。但是题目还加了一点东西,那就是最后一个中转站可以连接两个城市,也就是说最后一个单位时间可以完成两个任务。
按照贪心的思路,时限早的任务要先完成,因为时限晚的活动空间就很大,也可以替代之前的任务;同一时限的情况下显然价值越大的任务越先完成。这样先给所有的城市按照之前所说排个序,然后从头到尾扫一遍。同时保存一个当前时间的值now,初始化为1,设一个当前最优值res,最终答案ans,对于当前的这个城市,时限为t,价值为v,每次添加一个城市就++now,如果当前t >=now,那么说明这个城市可以接着尾巴添加一个中转站,并添加一个城市,此时now++,另外当 t == now - 1 的情况,这说明当前的城市和之前末尾的城市是一个时限t,这里处理很重要,首先不管怎样,先假设当前时间就作为末尾端,所以虽然时限now超过了t,但是当前城市还是可以插在末尾,并且更新ans;然后就要判断这个城市是否比之前已经放过的最小的城市的价值大,如果大的话就可以直接替换,因为当前城市的时限到目前为止是最大的,它可以替换之前任何一个城市,使得结果更优。这样这里就需要用一个优先队列来保存之前所填充的城市价值,实时维护最优值。
剩下的就是码代码了,代码不长但是我实力较弱,感觉也不是很好写,逻辑上有点疏漏就会出错,WA了7发终于过了,爽!
做完题就应该该好好过年了,前途有量,无需多想,明年加油!

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;struct node {int t, v;bool operator < (const node &b) const {if (t == b.t) return v > b.v;return t < b.t;}
}a[MAXN];int main() {//freopen("in.txt", "r", stdin);int n, h, Max = 1;scanf("%d%d", &n, &h);for (int i = 1; i <= n; i++) {scanf("%d%d", &a[i].t, &a[i].v);a[i].t = h - a[i].t;Max = max(Max, a[i].t);}sort (a + 1, a + 1 + n);priority_queue <int, vector <int>, greater<int> > que;int ans = 0, now = 1, res = 0;for (int i = 1; i <= n; i++) {if (a[i].t == 0) continue;if (a[i].t == now - 1) {ans = max(ans, res + a[i].v);   // 这里假设最后连接两个城市的情况,直接更新ansif (!que.empty() && a[i].v > que.top()) {res += a[i].v - que.top();      // 这里用当前城市来替代之前已经安排的城市,使最优值更优que.pop(); que.push(a[i].v);}}else {++now;que.push(a[i].v);      // 时限符合条件,直接把当前城市安排到最后res += a[i].v;}ans = max(ans, res);}printf("%d\n", ans);return 0;
}

51Nod - 1475 优先队列 + 贪心相关推荐

  1. LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 优先队列+贪心 1. 题目 给你一个整数数组 heights ,表示建筑物的高度.另有一些砖块 bricks 和梯子 ladders . 你 ...

  2. 【CF 732E】Sockets(优先队列+贪心)

    [CF 732E]Sockets(优先队列+贪心) 题目大意: n台电脑,m个供电器. 每台电脑和每个供电器都有电量,当电脑i的电量和供电器j电量相同时,可以连接供电. 现在提供变压器,可以连接到供电 ...

  3. 51nod 1475:建设国家 优先队列的好题

    1475 建设国家 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 小C现在想建设一个国家.这个国家中有一个首都,然后有若干个中间站,还有若干个城市 ...

  4. POJ3614Sunscreen(优先队列+贪心)

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8435   Accepted: 2981 Descrip ...

  5. *【HDU - 5711】Ingress(tsp旅行商问题,优先队列贪心,状压dp,floyd最短路,图论)

    题干: Brickgao, who profited from your accurate calculating last year, made a great deal of money by m ...

  6. LeetCode 1199. 建造街区的最短时间(优先队列贪心)

    文章目录 1. 题目 2. 解题 1. 题目 你是个城市规划工作者,手里负责管辖一系列的街区.在这个街区列表中 blocks[i] = t 意味着第 i 个街区需要 t 个单位的时间来建造. 由于一个 ...

  7. hdu 4544 优先队列+贪心

    题意:最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为 ...

  8. poj 3614 Sunscreen(优先队列+贪心)

    Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...

  9. BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表

    这题看别人题解的 这题说可以转换成数据备份. 这题可以把一段同号的数并成一个数,那么就变成了一个正负交替的序列,然后把头尾的负数去掉. 然后就是把所有的正值都加起来,并统计正数的段数cnt,如cnt& ...

最新文章

  1. 编译httpd-2.4.46的RPM包
  2. 《深入理解Spark:核心思想与源码分析》——1.2节Spark初体验
  3. 支持向量机(SVM)必备知识(KKT、slater、对偶)
  4. 超好用的简单的jquery tab选项卡切换代码(点击切换和导航栏滑过)
  5. 常用 TCP 端口作用及其操作建议
  6. java核心标签库,16.JSTL标签库(我的JavaEE笔记)
  7. 业务专题篇:用户使用路径分析
  8. VC++的windows服务
  9. maya脚本用python还是mel_替换/替换材质的Maya Python/MEL脚本
  10. win10下装win7双系统_电脑安装双系统win7+win10,安装顺序不同,使用会有什么不同?...
  11. Python 调用JSON接口实例
  12. 第七届山东理工大学ACM趣味编程循环赛 Round#1 sdut4109 玄黄的字符串
  13. PDF文件怎么转换成Word?这几种方法原来这么简单
  14. 关于侵权Sinesafe官方网站,仿冒、抄袭等恶劣行为的公告
  15. 微信内转发APP及h5类域名怎么做到防封防拦截,微信域名防红技术原理
  16. 大大方方补肾,平平常常做人 - 肾虚的症状和治疗
  17. 蒙泰RIP快捷键大全
  18. ROWNUM和ROWID的认识
  19. 【FPGA的基础快速入门15------DS18B20数字温度传感器】
  20. 主要的数据仓库开发软件及软件功能比较

热门文章

  1. java this调用构造方法_java this关键字调用构造方法
  2. css3获取最后一个元素,一个CSSselect器来获取最后一个可见的div
  3. Android列表用法之二:实战ListView高级用法
  4. iOS:UILabel省略号 NSLineBreakMode
  5. 重装win7后ubuntu系统没有了,如何找回ubuntu系统
  6. nginx的启动与停止
  7. Spring Bean配置细节author: 惠惠
  8. An Analysis of Scale Invariance in Object Detection – SNIP [CVPR2018]
  9. [转] invariance(不变性)解释与图例
  10. SQL Server数据库删除和修改