poj 1064(二分答案)

时间:2021-04-21 16:03:18

传送门:Problem 1064

https://www.cnblogs.com/violet-acmer/p/9793209.html

题意:

  有N条绳子,长度分别为 length[1,2,3,........,N]。

  如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长有多长?

  结果保留两位小数。

题解:

  二分可能的长度。

AC代码:

  精度问题:

  poj 1064(二分答案)

 #include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e4+; int N,K;
double length[maxn]; bool Check(double x)
{
int total=;
for(int i=;i <= N;++i)
total += (int)(length[i]/x);
return total >= K ? true:false;
}
int main()
{
scanf("%d%d",&N,&K);
double maxL=;
for(int i=;i <= N;++i)
{
scanf("%lf",length+i);
maxL=max(maxL,length[i]);
}
//解范围为 [l,r)
double l=,r=maxL+;
for(int i=;i <= ;++i)
{
double mid=l+((r-l)/);
if(Check(mid))//如果mid满足条件,则解的范围变为 [mid,r)
l=mid;
else
r=mid;//反之,解的范围变为[l,mid)
}
printf("%.2f\n",floor(l*)/);//printf()会四舍五入,而如果5入的话就不满足条件了
return ;
}