问题 I: 安装饮水机

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

为倡导城市低碳生活,市文明办计划举办马拉松比赛,为确保比赛安全,沿途设置了一些观察点。每个观察点派一个观察员驻守。由于天气比较炎热,需要在沿途安装一些饮水机,使得观察员可以去取水喝。由于观察员每移动一个单位的路程,需要耗费一个单位的体力。而每个观察员的体力有限,只能在他体力能支持的范围内去取水喝,要不他就会渴死或累死。
聪明的楠楠也参与了这次比赛的筹备工作。他的任务是设计一个理想的安装饮水机方案,使得安装的饮水机最少,但又保证所有观察员都能取到水喝。

 

输入

输入数据有若干行。。
第一行,仅一个整数,表示有N(0<n<=1000)个观察点。
接下来有N行,每行两个整数S(0<S<=100000)和W(0<W<=50000),其中S表示某个观察点到起点的路程,W表示该观察点中驻点观察员的体力。

输出

输出最少要安装几台饮水机。

样例输入 Copy

4
6 3
12 2
1 5
14 5

样例输出 Copy

2

提示

他可以将饮水机安装在距离起点为6和12的位置上,这样所有的观察员都能喝到水。方案有多种,只需输出最少需要几台饮水机即可。
 
思路:
他的任务是设计一个理想的安装饮水机方案,使得安装的饮水机最少,但又保证所有观察员都能取到水喝。
并且载体是一个直线正整数数轴,很难不想到用二分答案的方法来解决问题。
二分的是饮水机的数目,寻找的特殊状态是最小值。选用直接返回答案的二分模板:
    int l = 0, r = n;
while(l < r)
{
int mid = l + r >> 1;
if(check(mid)) l = mid + 1;
else r = mid;
}
cout<<l;

输入数据中每个数据有两个相关数据,而且都和每个点有关,所以考虑创建结构体进行计算与输入。

之后就要写check函数,首先考虑便是按其位置从小到大排序,然后贪心,遍历每一个元素,如果当前最近饮水机位置在范围内则跳过,反之则放在当前元素的最右端(由于是按位置排序)

但是这种贪心+排序的做法并没法ac,举一组hack数据:

5
1 9999
2 1
3 8888
4 1
5 7777

这组数据如果按照上述贪心进行遍历的话,第一个饮水机位置就会更新在10000这个点 然后第二个会放在3这个点 实际上 只需要放在3这个点就可以满足所有的需要

因此需要换一种贪心方式, 观察这组hack数据,可以发现,如果按a[i] + b[i]进行由小到大的排序,便可以贪心的跑完每一种情况

所以输入数据后,将结构体数组按a[i] + b[i]由小到大排序,可以通过重写sort实现。

记得初始化饮水机位置为0x3f3f3f3f(足够大就行)

代码: 2021.12.3

/*
************************************
***********emu^w^*********** */ #include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int P = 13131;
#define ll long long
const int mod = 1E6 + 7;
const int INF = 0x3f, sINF = 0x3f3f3f3f;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<long long, long long> PLL;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
//
const int N = 1010;
int n; struct answ{
int a, b;
}q[N]; bool cmp(const answ &x, const answ &y)
{
if(x.a + x.b != y.a + y.b) return x.a + x.b < y.a + y.b;
return x.a < y.a;
} bool check(int x)
{
int nums = x;
int loc = 0x3f3f3f3f;
for(int i = 1; i <= n; i++)
{
if(loc > q[i].a + q[i].b || loc < q[i].a - q[i].b) {
nums--;
loc = q[i].a + q[i].b;
}
if(nums < 0) return true;
}
return false;
} int main()
{
cin>>n;
for(int i = 1; i <= n; i++) cin>>q[i].a>>q[i].b;
sort(q + 1, q + 1 + n, cmp); int l = 0, r = n;
while(l < r)
{
int mid = l + r >> 1;
if(check(mid)) l = mid + 1;
else r = mid;
}
cout<<l;
}

I 安装饮水机 中国石油大学新生训练赛#10的更多相关文章

  1. C 上楼梯 中国石油大学新生训练赛#11

    问题 C: 上楼梯 时间限制: 1 Sec  内存限制: 128 MB提交 状态 题目描述 明明上n 级台阶可用四种步幅, 当然每种步幅花费的体力也不一样, 对应关系如下明明开始有m 个体力, 求他最 ...

  2. Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

    Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...

  3. Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)

    Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...

  4. Contest1593 - 2018-2019赛季多校联合新生训练赛第三场(部分题解)

    H 10255 自然数无序拆分 H 传送门 题干: 题目描述 美羊羊给喜羊羊和沸羊羊出了一道难题,说谁能先做出来,我就奖励给他我自己做的一样礼物.沸羊羊这下可乐了,于是马上答应立刻做出来,喜羊羊见状, ...

  5. 给未来的你——李开复2011级大学新生演讲

    2011年09月26日08:30 来源:<中国青年报> <中国青年报>的读者朋友们: 你们肩负着中华的未来,你们身上正涌动着创新的血脉! 无论你在哪所学校,哪个城市,你都是与众 ...

  6. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  7. 10.0.0.55_12-16训练赛部分writeup

    0x1 - MISC MISC100 一张帅行的照片 目测是图片隐写,但是binwalk并没有出来,应该是对文件头进行了修改 010editor查看一下,发现在jpg文件尾之后还有大量的数据 而且在灰 ...

  8. UPC个人训练赛第十五场(AtCoder Grand Contest 031)

    传送门: [1]:AtCoder [2]:UPC比赛场 [3]:UPC补题场 参考资料 [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html B.Re ...

  9. 2014北邮新生归来赛解题报告a-c

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

随机推荐

  1. Java如何实现消费数据隔离?

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为优质八股文选手 今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看的过程中不要忘记了点赞哟!建议 ...

  2. Solution -「CF 804F」Fake bullions

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点的竞赛图,第 \(i\) 个点代表了 \(s_i\) 个人,每个人(0-based)可能有真金条.此后在 ...

  3. Flask中本地栈的使用

    4种上下文变量 承接上一篇内容.当一个请求到来时,除了request被封装成全局变量之外,还有三个变量也是同样被封装成全局变量,那就是current_app.g.session.上面4个变量之所以能够 ...

  4. 一、Mybatis初体验

    本文章中所有操作均在idea2019中实现. 快速入门步骤: 1)添加Mybatis包 2)创建实体类User(对应数据库操作提前已准备,参考随笔tip1) 3)编写映射文件UserMapper.xm ...

  5. Java ClassLoader 学习笔记

    参考 Java类加载器(ClassLoader)

  6. java实现 TCP通信

    //服务端import com.hl.bluetooth.util.CRC16; import com.hl.bluetooth.util.FrameCheckFailedException; imp ...

  7. Spring-servlet随笔1

    一:工程思想 1.建立父工程 2:导入通用依赖 3:删除无用文件 4:创建不同模块. pom.xml 依赖文件: <dependencies>   <dependency>   ...

  8. [题解]第十一届北航程序设计竞赛预赛——A.模式

    题目描述 输入一个学号,判断是计算机系or软件学院or其他院系. 解题思路 水题,直接判断or除以10000都可以.不废话,直接上代码. 1 #include <iostream> 2 # ...

  9. windev中编辑表单确认按钮的code规范建议

    编辑表单的确认操作,是一个常规操作,根据过往经验,建议按以下规范代码来撸.案例如下所示(主子表保存): //填报规范:必填项目 IF COMBO_招聘职位 = "" OR COMB ...

  10. UnboundLocalError: local variable ‘xxx‘ referenced before assignment

    原因 在Python函数中调用了某个和全局变量同名的局部变量,导致编译器不知道此时使用的是全局变量还是局部变量 a = 3 def func(): a+=3 func() UnboundLocalEr ...