剪绳子

剪绳子

实数二分模板题

首先确定好l = 0, r = 1e9。
check函数不用特判mid必须小于a[i],即最短的裁剪长度可以比已经有的绳子的长度长。

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
typedef long long ll;

const int N = 100000+10;

int n,m;
int a[N];

bool check(double mid,int m)
{	
	int cnt = 0;
	for (int i = 0; i < n; i ++ )
	{
		//if (a[i] < mid) return false;
		cnt += a[i] / mid;
	}	
	return cnt >= m;
}

int main(){
	scanf("%d%d",&n,&m);
	for (int i = 0; i < n; i ++ )
		scanf("%d",&a[i]);

	double l = 0, r = 1000000000;
	while(r - l > 1e-3)
	{
		double mid  = (l + r) / 2;
		if (check(mid,m)) l = mid;
		else r = mid;
		//cout<<l<<' '<<r<<endl;	
	}
	printf("%.2f",r);
    return 0;
}
posted @ 2021-05-04 23:20  Treasure_lee  阅读(56)  评论(0编辑  收藏  举报