问题描述: 给定n条绳子固定分为k段(n,k)在输入文件里 求这几段绳子每段最大分为多长
Tips:精度为cm,即两位有效数字 每段至少长为1m
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
int n,k;
double xl[10000 + 5];
const double INF = 100000;
bool C(double x)
{
int num = 0;
for(int i = 0;i<n;i++)
{
num += (int)(xl[i] / x);
}
return num >= k;
}
int main()
{
cin >> n >> k;
for(int i = 0;i<n;i++)
{
scanf("%lf",&xl[i]);
}
double l = 0,r = INF;
for(int i = 0 ;i<100;i++)
{
double mid = (l+r) / 2;
if(C(mid)) l = mid;
else
r = mid;
}
printf("%.2lf\n",floor(r*100) / 100);
}
思路: 令C(x)代表每段最长为k 只需要从0~INF中使用二分法搜索满足条件的最大x即可。
100次已经保证精度为2^-30
判断方式为:计算每条绳子可以分成长为x的几段 相加 若等于k 就说明满足条件,反之不满足条件。
由于本题使用二分搜索解决的是最大化问题(满足条件的最长的x)
那么当mid满足条件时 应该把区间由(l,r)改为(mid,r)