洛谷P2678跳石头题解
这个题也是一个很经典的题了。其主要思想也是二分答案,原因就是题目中只要出现最大值最小或最小值最大,这种描述十有八九就是二分答案。
这个题原题也是让我们求最短的跳跃距离的最大值。
显而易见,最大值肯定要在1到n之间。
所以我们就从1到n二分跳跃距离。这样就可以以log级别的时间复杂度来枚举出最大值。
二分应该都会吧,就是在符合单调性一段区间内以log级时间来给定值的位置或最小的大于给定值的位置,或者最大的小于给定值的位置的一种算法。
那这个题跳跃距离也是符合单调性的,所以我们就可以用二分来快速枚举。
我们先考虑一个问题,对于一个给定距离d,判断是否要达到这个距离的石头数<m,如果可以,那我们试一试在增加一下,如果不行了,就减小,在这个过程中二分。
当然想到二分,这个题也并不是完了,更重要的是判断二分的左边界和右边界问题。
最后总结一下,遇到二分题,它让你求啥,你就二分啥。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define M 50010
using namespace std;
int l, n, m, left, right;
int dis[M], data[M], maxn, sum;
bool check(int pos)
{
sum = ;//sum是要移走的石头数
int last = ;
for(int i = ; i <= n; i++)
{
if(data[i] - last < pos)//last是上一次跳的位置,如果从last调到当前位置所用的距离并不够,就把这个石头移走,判断下一个石头,直到可以满足。
{
sum++;
continue;
}
last = data[i]; }
if(sum > m)//到最后判断如果要跳这个距离,所用的石头数有没有超出限制。
return false;
return true;
}
int main()
{
scanf("%d%d%d", &l ,&n, &m);
for(int i = ; i <= n; i++)
scanf("%d", &data[i]);
data[n + ] = l;
int left = ,right = l;
while(left <= right)
{
int mid = (left + right) >> ;
if(check(mid))//当不超出限制,我们就试试再大的距离可不可以
{
maxn = mid;
left = mid + ;
}
else//当超出限制了,我们就看看小了可以吗
right = mid - ;
}
printf("%d", maxn);
}
洛谷P2678跳石头题解的更多相关文章
- [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)
[NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...
- 洛谷 p2678 跳石头 题解
一道裸的二分答案 如果不会分治的去找dalao吧,本蒟蒻只会二分 不知道二分答案的看这里 这位dalao解释的很详细其实只是随便找了一个 那里面貌似也有这个题的题解,但我还是要写(才不是应付老师) 关 ...
- 洛谷 P2678 跳石头
题目背景 一年一度的"跳石头"比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间 ...
- [NOIP2015] 提高组 洛谷P2678 跳石头
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...
- 【【洛谷P2678 跳石头】——%%%ShawnZhou大佬】
{dalao传送门} 这道题如果要使用暴力搜索直接求解会严重超时.实际上,我们可以发现,这个所谓的最短跳跃距离显然不能超过一个范围,而这个范围题目上已经给了出来.也就是说,答案是有一个确定的范围限制的 ...
- 洛谷P2678跳石头(提高)
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点. 在起点和终点之间,有 N 块岩石( ...
- 洛谷——P2678 跳石头
https://www.luogu.org/problem/show?pid=2678#sub 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着 ...
- 二分答案 & 洛谷 P2678 跳石头
首先让我们先学一下二分答案这个东西... 二分答案,肯定与二分有关,还与可能是答案的东西有关... 二分答案的准确定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转 ...
- 洛谷 P2678 跳石头【经典二分答案/贪心】
题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石).在比赛过程中,选手们将从 ...
随机推荐
- 简单的将Excel数据同步到SqlServer数据库中
1.创建一个WinForm程序,添加一个Button控件 2.Button事件 private void button1_Click(object sender, EventArgs e) { Sys ...
- python第五章:文件--小白博客
文件操作, 操作文件完毕后一定要记得close # 读,默认是rt(文本的方式读取),rb模式是以字节读取 # 文件路径可以用3中形式表示 f = open(r'C:\Users\fengzi\Des ...
- Springboot+Redis 配置和使用
pom.xml 引入redis 开启缓存 <!-- cache --> <dependency> <groupId>org.springframework.boot ...
- PS打造油画般的风景人像
- 斐波那契数列yield表示
def fib(num): n=0 a,b=0,1 while n<num: print(b) yield a,b=b,a+b n=n+1a=fib(30)next(a)next(a)
- redis的应用场景 为什么用redis
一.不是万能的菲关系系数据库redis 在面试的时候,常被问比较下Redis与Memcache的优缺点,个人觉得这二者并不适合一起比较,redis:是非关系型数据库不仅可以做缓存还能干其它事情,Mem ...
- mysql 中Varchar 与char的区别
一.字符与字节与编码关系 ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制.最 ...
- 福州大学软件工程1816 | W班 第5次作业成绩排名
写在前面 汇总成绩排名链接 1.作业链接 第五次作业--项目选题报告(团队) 2.评分准则 本次作业映射总分为100分+贡献度得分,由以下部分组成: 选题报告内容(10分) 本组评审表设计(5分) 现 ...
- VMware威睿
VMware总部位于美国加州帕洛阿尔托 [1] ,是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案, 企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任 [2- ...
- Java 数据库操作
目录 Java数据库组织架构 下载驱动包 连接数据库 连接数据库的三个步骤 连接数据库的高开销 Statement接口介绍 PreparedStatement类 使用PreparedStatement ...