洛谷 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;
 }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值