当前位置:   article > 正文

跳房子游戏_跳房子js

跳房子js

一 问题描述

二 算法设计

1 如果移除石头数等于总石头数(M=N),则直接输入L。

2 增加开始(0)和结束(N+1)两块石头,到开始节点的距离分别为 0 和 L。

3 对所有的石头都按照从开始节点的距离从小到大排序。

4 让 left = 0,right=L,如果 right-left>1,则 mid=(right+left)/2,判断是否满足移除 M 块石头之后,任意间距都小于 mid。如果满足,则说明距离还可以更大,让 left = mid;否则让 right = mid,继续进行二分搜索

5 搜索结束后, left 就是母牛必须跳跃的最短距离的最大值。

三 代码

  1. package com.platform.modules.alg.alglib.poj3258;
  2. import java.util.Arrays;
  3. public class Poj3258 {
  4. public String output = "";
  5. private final int maxn = 50050;
  6. private Integer L;
  7. private Integer n;
  8. private Integer m;
  9. private Integer dis[] = new Integer[maxn];
  10. public Poj3258() {
  11. for (int i = 0; i < dis.length; i++) {
  12. dis[i] = 0xFFFFFFF;
  13. }
  14. }
  15. public String cal(String input) {
  16. String[] line = input.split("\n");
  17. String[] line1 = line[0].split(" ");
  18. L = Integer.parseInt(line1[0]);
  19. n = Integer.parseInt(line1[1]);
  20. m = Integer.parseInt(line1[2]);
  21. if (n == m) {
  22. return L.toString();
  23. }
  24. for (int i = 1; i <= n; i++) {
  25. dis[i] = Integer.parseInt(line[i]);
  26. }
  27. dis[0] = 0; // 增加开始点
  28. dis[n + 1] = L; // 增加结束点
  29. Arrays.sort(dis, 0, n + 1);
  30. //sort(dis, dis + n + 2);
  31. Integer left = 0;
  32. Integer right = L;
  33. while (right - left > 1) {
  34. int mid = (right + left) / 2;
  35. if (judge(mid))
  36. left = mid;//如果放得开,说明x还可以更大
  37. else
  38. right = mid;
  39. }
  40. return left.toString();
  41. }
  42. boolean judge(int x) { //移除m个石头之后,任意间距不小于x
  43. int num = n - m; //减掉m个石头,放置num个石头,循环num次
  44. int last = 0; //记录前一个已放置石头下标
  45. for (int i = 0; i < num; i++) { //对于这些石头,要使任意间距不小于x
  46. int cur = last + 1;
  47. while (cur <= n && dis[cur] - dis[last] < x) //放在第1个与last距离>=x的位置
  48. cur++; //由cur累计位置
  49. if (cur > n)
  50. return false; //如果在这个过程中大于n了,说明放不开
  51. last = cur; //更新last位置
  52. }
  53. return true;
  54. }
  55. }

四 测试

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/208997
推荐阅读
相关标签
  

闽ICP备14008679号