• P2678 [NOIP2015 提高组] 跳石头


    来自 <[NOIP2015 提高组] 跳石头 - 洛谷>

    题意:

     题目就是说有在起点和终点里面有5个石头,现在让你移出两个石头,要移哪两个可以满足最后最短距离最长。假如现在要移11位置和14位置的两块石头,最后的最短距离是2,而如果移的是2位置和14位置的两块石头,最后的最短距离是4。因此我们认为4是我们的最长最短距离。

    思路:

    而如果我们正面去想如何移是一件很难的事,我们可以从最短距离的角度去思考。我们知道最短距离的长度无非就是025这个区间内的,所以我们可以暴力假设,如果最短距离为1可不可以成立,如果最短距离是2可不可以成立…….

    但我们可以直接二分取中间值来假设,假如最短距离取(0+25)/2=12;然后扫描整个装着石头的数组,如果距离小于12,那么我们就取石头,然后计数,如果计数值超过题目规定的,说明这个最短距离长度不满足。所以r=mid-1;反之,如果成立,我们会继续扩大我们的最短距离,毕竟题目中要的是最长的。l=mid。

     代码:
    1. import java.util.Scanner;
    2. public class Main {
    3. public static int L;
    4. public static int N;
    5. public static int M;
    6. public static int[] a=new int[50010];
    7. public static void main(String[] args) {
    8. Scanner scan=new Scanner(System.in);
    9. L=scan.nextInt();
    10. N=scan.nextInt();
    11. M=scan.nextInt();
    12. a[0]=0;a[N+1]=L;
    13. for(int i=1;i<=N;i++){
    14. a[i]=scan.nextInt();
    15. }
    16. int l=0,r=L;
    17. while(l
    18. int mid=(l+r+1)/2;
    19. if(judge(mid)){//如果成立,我们会继续扩大我们的最短距离,毕竟题目中要的是最长的
    20. l=mid;
    21. }
    22. else {
    23. r=mid-1;
    24. }
    25. }
    26. System.out.println(l);
    27. }
    28. public static boolean judge(int shortDistance){
    29. int now=0;
    30. int cnt=0;
    31. for(int i=1;i<=N+1;i++){
    32. if(a[i]-a[now]//扫描整个装着石头的数组,如果距离小于12,那么我们就取石头,然后计数
    33. cnt++;
    34. }
    35. else {
    36. now=i;
    37. }
    38. }
    39. if(cnt>M){//如果计数值超过题目规定的,说明这个最短距离长度不满足
    40. return false;
    41. }
    42. else {
    43. return true;
    44. }
    45. }
    46. }

  • 相关阅读:
    过去将来时习题
    springboot面向园区管理的物联网云平台设计与实现毕业设计源码150916
    关于 Notion-Like 工具的反思和畅想
    leetcode做题笔记2342. 数位和相等数对的最大和
    性能测试常见的测试指标
    C++Qt开发——阻止系统休眠方法
    JVM篇---第二篇
    猿创征文|大厂说的 代码门禁如何实现?
    软件开发生命周期
    Java多线程——Callable和future
  • 原文地址:https://blog.csdn.net/m0_73866527/article/details/133872237