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

题目

题意:就是给出一段距离,中间有n个石头,每次你都减少一块石头使得最小的距离减少,求减少m个石头后的最小距离

思路:数据比较大,暴力过不去,但是我们可以知道是在给定距离内去找到一个合法的最大的数,如果暴力需要遍历每一个,所以可以用二分每次取中间达到最大

AC代码:

package 练习;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
 static int N=50006;
 static long s[]=new long [N];
 static int n,m;
 public static void main(String[] args) {
  Scanner sc=new Scanner(System.in);
  long l;
  l=sc.nextLong();
  n=sc.nextInt();
  m=sc.nextInt();
  for(int i=0;i<n;i++)s[i]=sc.nextLong();
  long left=1;
  long right=l;
  s[n]=l;
  long ans = 0;
  while(left<=right) {
   long mid=(left+right)/2;
   if(check(mid)) {
    ans=mid;
    left=mid+1;
   }else right=mid-1;
  }
  System.out.println(ans);
 }
 private static boolean check(long mid) {
  long sum=0;
  int num=0;
  for(int i=0;i<=n;i++) {
   if(s[i]-sum<mid)num++;
   else sum=s[i];
  }
  if(num>m)return false;
  else return true;
 }
}

你可能感兴趣的:(算法题目)