题目:减绳子
思路:
找出最长的绳子 长sum,答案在 lefr = 0 -- right = sum之间。使用二分查找。
当a[ i ]/mid之和 < 需绳数M时,left 偏小 令 left = left + 0.0005 ;
当a[ i ]/mid之和 > = 需绳数M时,right 偏大 令 right = right + 0.0005 ;
当left = right 时 绳长最长 ,M根绳长最长为 left 。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
long long int a[100005];
int n,k,ans,sum;
double mid;
double binary_search(int len){
double left=0;
double right=len;
while(left<right){
mid=(left+right)/2;
ans=0;
for(int i=0;i<n;i++){
ans+=(a[i]/mid);
}
if(ans<k){
right=mid-0.0005;
else if(ans>=k){
left=mid+0.0005;
}
}
return left;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>sum)sum=a[i];
}
printf("%.2lf",binary_search(sum));
return 0;
}