洛谷P2678 Java解法
题目出处点这里
思路:
形如求最小值的最大值以及求最大值的最小值都可以二分求解。
就像这道题,求最短的跳跃距离尽可能长(就是求最小值的最大值),注意到跳跃距离肯定在1至L之间,于是问题就变为在1~L之间求可行解的最大值,可行解就是跳跃距离的最小值,如果照着题目的思路思考,我们的思维可能会被只能移走M快岩石限制住,因此我们可以逆向思考,从结果入手:每次取1-L中mid的值,把每次的mid当作跳跃距离,然后判断跳跃距离为mid时需要移动的岩块sum为多少。如果sum<=M,那就说明这个最大值mid可以作为最大值,又因为1-L单调增,因此可能mid右边的也可以作为跳跃距离,所以往右边接着找;如果sum>M,那就说明这个最大值mid不能作为最大值,因为跳跃距离太大了,需要移动的石块sum也很多,因此我们得把跳跃距离弄小点,往mid左边寻找。
其中check()函数就是判断跳跃距离为mid时,需要跳过多少个石块
代码:
package binaryFindAndAnswer;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;public class P2678 {static int L, N, M;static int[] arr;//存储每个石块的距离public static void main(String[] args) throws IOException {StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));st.nextToken();L = (int) st.nval;st.nextToken();N = (int) st.nval;st.nextToken();M = (int) st.nval;arr = new int[N + 2];// arr初始化,实际上N+2块石头(包括头尾两块)for (int i = 1; i <= N; i++) {st.nextToken();arr[i] = (int) st.nval;}arr[N + 1] = L;// 注意L才是终点int l = 0, r = L;// 开始对
// int ans = 0;//也可以用ans记录midwhile (l <= r) {int mid = (l + r) / 2;if (check(mid)) {//如果mid可以作为最大值,又因为l~r单调增,说明mid右边也有可能,因此l = mid + 1l = mid + 1;
// ans = mid;}else {//如果不可以作为最大值,说明最大值在左边r = mid - 1;}}//输出当check(mid)为ture时的mid,此时mid=l-1System.out.println(l-1);//也可以用ans记录每次mid可行时的mid,并输出
// System.out.println(ans);}public static boolean check(int mid) {int sum = 0,now = 0;//now代表现在所在的石块for (int i = 1; i < N+2; i++) {//因为此时我们假设此时的跳跃距离mid就是最大值,如果两个石头间隔小于mid那就说明可以拿走//如果两个石头距离大于mid,我们就根本跳不过去,所以这块石头不能拿掉,只好在下块石头接着跳if (arr[i] - arr[now] < mid) {//说明可以拿走sum++;}else {//说明不能拿走now = i;//那我们就到这一块石头上去继续判断}}if (sum > M) {//当要移的石块大于Mreturn false;}else {//当要移动的石块小于等于M,说明此mid可行return true;}}}
洛谷P2678 Java解法相关推荐
- 洛谷P2298 Java解法
题目出处点这里 很明显又是广搜模板题 代码: package search;import java.awt.Point; import java.util.LinkedList; import jav ...
- 洛谷P2404 Java解法
题目出处 思路:肯定打表啊! 用一个数组arr[]存储每次拆分的结果,满足条件就输出,不断再原来数组基础上进行搜索即可,不过要注意输出的数是从小到大的,因此我们可以用一个变量zz记录每次存进arr[] ...
- 洛谷P1618 Java解法
题目出处:https://www.luogu.com.cn/problem/P1618 思路: 从结果入手 先在123-987中找到满足A:B:C的三个数 再判断三个数的各个数字是否有重复的 pack ...
- 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头
[题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...
- 二分答案——跳石头(洛谷 P2678)
题目选自洛谷P2678 这道题题目并不复杂,思考一下也能知道用二分的方法来做. 难点在于如何判断是否满足条件,以及二分的边界问题. 下面给出详细解题思路: //tot表示需要搬走的石块数量,i表示找的 ...
- P1164 小A点菜(DP动态规划,洛谷,java)
洛谷链接:https://www.luogu.org/problem/P1164 i写成了j,改了nnnnn久!!!! import java.util.Scanner; class Main{pub ...
- P1002 过河卒(dp动态规划,洛谷,java)
洛谷链接:https://www.luogu.com.cn/problem/P1002 import java.util.Scanner;public class Main { public stat ...
- P2392 kkksc03考前临时抱佛脚(洛谷)JAVA
题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 4 科.因此要开始刷习题集,每科都 ...
- P1042 乒乓球(模拟,字符串,不指定输入,洛谷,java)
洛谷链接:https://www.luogu.com.cn/problem/P1042 借鉴链接:https://blog.csdn.net/a1439775520/article/details/9 ...
最新文章
- C语言之typedef详解
- CLion 控制台输出内容乱码问题的解决方法
- MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数
- mysql slave是什么_创建slave的搜索结果-阿里云开发者社区
- 科大星云诗社动态20220106
- 如何检测远程主机上的某个端口是否开启
- Swift基础之方法实战
- uva10160(dfs+状态压缩)
- ASP.NET Core集成Nacos配置中心之适配多格式配置
- 跟随我在oracle学习php(21)
- 3dmax材质丢失插件_3dmax插件排行|室内设计师效果图用疯狂模渲大师,怎么把cononra材质转换成vray材质?...
- beforeEach钩子与无限循环问题
- Android开发里的自定义View的实现
- leetcode·单调栈
- Linux netstat 命令安装
- T3 登陆报错 3709
- 4种方法!怎么把电脑上的音频传到苹果手机上?
- 锂离子电池热失控预警资料整理(二)
- 1-编程基础及Python环境部署
- 为什么 APISIX Ingress 是比 Traefik 更好的选择?
热门文章
- بۇر بىر سىناق
- 利用DICOM文件实现2D与3D体素坐标之间的转换
- tsv文件导oracle窜列,TSV文件扩展名 - 什么是.tsv以及如何打开? - ReviverSoft
- 职场人需要的2大礼物
- 有哪些业务会用到物理服务器?
- 2022(一等奖)C23“城轨促交融,慢行赋新机”—TOD模式下城市慢行接驳与碳减排辅助出行系统
- 华为云数据库VS自建数据库,上“云”不是智商税
- 下列python语句的输出结果是_下列Python语句的输出结果是
- pytorch 统计模型参数个数
- 恶搞好朋友 java