• 蓝桥杯 Java 青蛙过河


     

     

    1. import java.util.Scanner;
    2. // 1:无需package
    3. // 2: 类名必须Main, 不可修改
    4. /**
    5. 二分法从大(n)到小找足够小的步长
    6. 前缀和记录每个位置的前面有的总石头数(一个石头表示可以容纳一个青蛙,一位置有多少个石头hi就是多少),方便计算
    7. 相当于2x个青蛙从起点到终点
    8. 起点0个石头,终点无数个石头,代表可以容纳无数个青蛙
    9. 检查步长是否符合要求:
    10. 对每个点检查
    11. 如果这个点能跳到的区域内的石头数够2x(也就是下一步可以容纳2x个青蛙)(这一步用两个前缀和相减获得)
    12. 如果当前点的可跳区域包含终点就相当于可以直接到终点,而前面肯定是算了可以到当前点的
    13. 举例:
    14. 按题目意思h就为
    15. 0 1 0 1 0 INF
    16. 前缀和就为
    17. 0 1 1 2 2 INF
    18. 如果步长为2
    19. 那么先检查索引为0的点
    20. 0 1 2 3 4 5
    21. 可跳点为 1 2
    22. 该区域总石头数为 1 - 0 = 1 < 2x
    23. 也就是说青蛙如果在索引为0的点以当前步长能力无法跳到下一区域
    24. 如果步长为4
    25. 那么先检查索引为0的点
    26. 0 1 2 3 4 5
    27. 可跳点为 1 2 3 4
    28. 该区域总石头数为 2 - 0 = 2 = 2x
    29. 也就是说青蛙如果在索引为0的点以当前步长能力能跳到下一区域
    30. 检查索引为1,该点可以直接跳到终点
    31. 所以步长为4可以
    32. 优化:
    33. 前缀和不用考虑终点,终点直接利用长度判定即可
    34. */
    35. public class Main {
    36. static int n,x;
    37. static int[] q;
    38. public static void main(String[] args) {
    39. Scanner scan = new Scanner(System.in);
    40. n = scan.nextInt();
    41. x = scan.nextInt();
    42. q = new int[n];
    43. for(int i = 1;i < n;i++)
    44. q[i] = scan.nextInt() + q[i-1];
    45. int l=0;
    46. int r=n;
    47. // 二分法提高寻找最小区间(步长k=l)的效率
    48. while(l < r) {
    49. //如果该步长符合要求——该步长内的所有连续区间承受的跳跃次数>2*x
    50. //则缩小k
    51. int mid = (l + r)/2;
    52. if(check(mid))
    53. r = mid;
    54. //反之,扩大k
    55. else
    56. l = mid + 1;
    57. }
    58. //直到找到理论上最小就可以满足的步长K(==l)
    59. System.out.print(l);
    60. scan.close();
    61. }
    62. private static boolean check(int k) {
    63. //遍历所有步长为k的连续区间
    64. for(int i=0;i
    65. if(q[i+k]-q[i]<2*x)
    66. return false;
    67. return true;
    68. }
    69. }

  • 相关阅读:
    科技资讯|Vision Pro头显无损音频仅限USB-C AirPods Pro 2耳机
    Redis面试题(2022)
    算法:数组中的最大差值---“打擂台法“
    vue造轮子完整指南--npm组件包开发步骤
    操作系统题目收录(二)
    SAP MM学习笔记37 - 请求书照合中的 追加请求/追加Credit 等概念/ 请求书的取消
    mysql主从复制实践
    Tomcat
    java 短路运算符用法 和 短路运算符的好处
    【Azure 环境】把OpenSSL生产的自签名证书导入到Azure Key Vault Certificate中报错
  • 原文地址:https://blog.csdn.net/weixin_45322373/article/details/134019271