题意:就是给出一段距离,中间有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;
}
}