题目链接:http://poj.org/problem?id=1064
这个题目就是个二分,但是wa了好多次。
注意点:
1. 最后使用floor函数向下取整
2. 判断当前可以割出多少段的时候算出k段也是割的太小了
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define exp 1e-5
using namespace std;
const int maxn = 10000 + 20;
int N,K;
double arr[maxn];
bool judge(double cut)
{
int num = 0;
for(int i = 0;i < N;++i){
num += static_cast<int>(arr[i] / cut);
}
if(num >= K)
return true; //说明割得太小了
else
return false; //说明割的太大了
}
int main()
{
double left = 0,right = 0,mid;
scanf("%d %d",&N,&K);
for(int i = 0;i < N;++i){
scanf("%lf",&arr[i]);
right += arr[i];
}
sort(arr,arr + N);
while(right - left > exp){
mid = right + (left - right)/2;
if(judge (mid))
left = mid;
else {
right = mid;
}
}//binary
printf("%.2lf\n",floor(right*100)/100);
return 0;
}