[ACM]【二分查找】POJ 1064 割繩子

傳送門(virtual judge冬令營上做的)
題意:多段繩子,求能分割最長多長的k段等長繩子出來。精度爲小數點後2位。在這裏插入圖片描述
二分不解釋。

代碼:

#include<bits/stdc++.h>
using namespace std;
double a[10004];
int n,m;
int check(double l){
	int cnt=0;
	for(int i=1;i<=n;i++)
		cnt+=(int)(a[i]/l);//計算能分多少條
	return cnt>=m;
}
int main(){
	scanf("%d%d",&n,&m);
	double m=0;
	for(int i=1;i<=n;i++){
		scanf("%lf",&a[i]);
		m=max(m,a[i]);
	}
	double low=0,high=m;
	for(int i=0;i<80;i++){
	//這裏用for循環80次,代替了while(low<=high)
	//是因爲low和high都是小數
	//要控制精度,就不能那樣操作
	//除非在下面low=mid+0.00001這樣
	//爲什麼是80次?我也不知道。。
	//據說是因爲是2^80=1e24,精度足夠
		double mid=(low+high)/2;
		if(check(mid)) low=mid;
		else high=mid;
	}
	printf("%.2f\n",floor(high*100)/100);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章