题目出处点这里

思路:

形如求最小值的最大值以及求最大值的最小值都可以二分求解。
就像这道题,求最短的跳跃距离尽可能长(就是求最小值的最大值),注意到跳跃距离肯定在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解法相关推荐

  1. 洛谷P2298 Java解法

    题目出处点这里 很明显又是广搜模板题 代码: package search;import java.awt.Point; import java.util.LinkedList; import jav ...

  2. 洛谷P2404 Java解法

    题目出处 思路:肯定打表啊! 用一个数组arr[]存储每次拆分的结果,满足条件就输出,不断再原来数组基础上进行搜索即可,不过要注意输出的数是从小到大的,因此我们可以用一个变量zz记录每次存进arr[] ...

  3. 洛谷P1618 Java解法

    题目出处:https://www.luogu.com.cn/problem/P1618 思路: 从结果入手 先在123-987中找到满足A:B:C的三个数 再判断三个数的各个数字是否有重复的 pack ...

  4. 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头

    [题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...

  5. 二分答案——跳石头(洛谷 P2678)

    题目选自洛谷P2678 这道题题目并不复杂,思考一下也能知道用二分的方法来做. 难点在于如何判断是否满足条件,以及二分的边界问题. 下面给出详细解题思路: //tot表示需要搬走的石块数量,i表示找的 ...

  6. P1164 小A点菜(DP动态规划,洛谷,java)

    洛谷链接:https://www.luogu.org/problem/P1164 i写成了j,改了nnnnn久!!!! import java.util.Scanner; class Main{pub ...

  7. P1002 过河卒(dp动态规划,洛谷,java)

    洛谷链接:https://www.luogu.com.cn/problem/P1002 import java.util.Scanner;public class Main { public stat ...

  8. P2392 kkksc03考前临时抱佛脚(洛谷)JAVA

    题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 4 科.因此要开始刷习题集,每科都 ...

  9. P1042 乒乓球(模拟,字符串,不指定输入,洛谷,java)

    洛谷链接:https://www.luogu.com.cn/problem/P1042 借鉴链接:https://blog.csdn.net/a1439775520/article/details/9 ...

最新文章

  1. C语言之typedef详解
  2. CLion 控制台输出内容乱码问题的解决方法
  3. MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数
  4. mysql slave是什么_创建slave的搜索结果-阿里云开发者社区
  5. 科大星云诗社动态20220106
  6. 如何检测远程主机上的某个端口是否开启
  7. Swift基础之方法实战
  8. uva10160(dfs+状态压缩)
  9. ASP.NET Core集成Nacos配置中心之适配多格式配置
  10. 跟随我在oracle学习php(21)
  11. 3dmax材质丢失插件_3dmax插件排行|室内设计师效果图用疯狂模渲大师,怎么把cononra材质转换成vray材质?...
  12. beforeEach钩子与无限循环问题
  13. Android开发里的自定义View的实现
  14. leetcode·单调栈
  15. Linux netstat 命令安装
  16. T3 登陆报错 3709
  17. 4种方法!怎么把电脑上的音频传到苹果手机上?
  18. 锂离子电池热失控预警资料整理(二)
  19. 1-编程基础及Python环境部署
  20. 为什么 APISIX Ingress 是比 Traefik 更好的选择?

热门文章

  1. بۇر بىر سىناق
  2. 利用DICOM文件实现2D与3D体素坐标之间的转换
  3. tsv文件导oracle窜列,TSV文件扩展名 - 什么是.tsv以及如何打开? - ReviverSoft
  4. 职场人需要的2大礼物
  5. 有哪些业务会用到物理服务器?
  6. 2022(一等奖)C23“城轨促交融,慢行赋新机”—TOD模式下城市慢行接驳与碳减排辅助出行系统
  7. 华为云数据库VS自建数据库,上“云”不是智商税
  8. 下列python语句的输出结果是_下列Python语句的输出结果是
  9. pytorch 统计模型参数个数
  10. 恶搞好朋友 java