https://vjudge.net/problem/POJ-1064
题意:有n条绳子,他们的长度分别为Li。如果从他们中切割出k条长度相同的绳子,这k条绳子每条最初那个能有多长?答案保留到小数点后2位。
思路:利用二分答案,将绳子的长度进行二分枚举。
注意点:
将小数后k位截断的方法是使用floor(ans*pow(10,k))/pow(10,k)
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double a[10005];
int n,m;
bool check(double ms){
int num=0;
for(int i=0;i<n;i++){
num+=a[i]/ms;
}
if(num>=m) return true;
else return false;
}
double bSearch(double left,double right){
double mid;
int t=1010;
while(t--){ //设置结束循环的条件一般为left<=right,这里由于涉及答案精度,故不采用。
//答案1次循环可以把区间缩小一半,100次可以达到10^(-30)的精度。
mid=(left+right)/2;
if(check(mid))
left=mid;
else
right=mid;
}
printf("%.2lf\n",floor(right*100)/100); // !! 若不加floor,默认四舍五入
return right;
}
int main(){
while(cin>>n>>m){
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
}
double ans=bSearch(0,200005); //注意范围
}
return 0;
}