实数域二分(java)刷题记录

题目一

Cable master

有N条绳子,它们的长度分别为Li,如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后两位

样例输入:
N=4
K=11
L={8.02, 7,43, 4.57, 5.39}

样例输出
2.00

看到精确度就可以猜到了,可以用实数域二分,
代码如下,思路很简单

import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
	static int N,K;
	static float[] L = new float[10000];
	static float sum;
	static boolean C(float x) {
		int cnt = 0;
		for(int i=0; i<N; i++) {
			cnt  += (int)L[i]/x;
		}
		return cnt>=K;
	}
	public static void main(String[] args) {
		 Scanner in = new Scanner(System.in);
		 N = in.nextInt();K = in.nextInt();
		 for(int i=0; i<N; i++) {
			 L[i] = in.nextFloat();
			 sum +=L[i];
		 }
		 float low = 0;
		 float high = sum;
		 float mid = low;
		 for(int i=0; i<100; i++) {
			 mid = (low+high)/2;
			 if(C(mid))low = mid;
			 else high=mid;
		 }
		 BigDecimal bd = new BigDecimal(low);
		 System.out.println(bd.setScale(2,BigDecimal.ROUND_HALF_UP));
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值