代码:《挑战程序设计竞赛》3.1.2
#include<iostream>
using namespace std;
#define MAX_N 100
#define INF 200000
int N, K; //N为绳子数目,K为切割出的绳子数量
double L[MAX_N]; //记录每条绳子长度
bool judge(double x) //判断函数
{
int num = 0; //记录能割出长度为x的绳子的数目
for (int i = 0; i < N; i++)
{
num += (int)(L[i] / x); //每条绳子长度除以切割出的绳子长度,得到每条绳子可切割出的绳子的数目
}
return num >= K; //返回最后的绳子总数是否大于需要的K
}
void solve() //利用二分查找,夹逼出结果
{
double lb = 0, ub = INF;
while(ub - lb >= 0.01) //反复枚举直至解的范围足够小
{
double mid = (lb + ub) / 2;
if (judge(mid)) lb = mid; //如果长度为mid时符合条件,更新下界
else ub = mid;
}
printf("%.2f", floor(ub * 100) / 100); //省去小数点后两位之后的数字
}
int main()
{
cin >> N >> K;
for (int i = 0; i < N; i++)
{
cin >> L[i];
}
solve();
return 0;
}
//测试用例
/*
4
11
8.02 7.43 4.57 5.39
*/