题意:有N条绳子,从他们中切割出来K条长度相同的绳子的话,这K条绳子每条最长能有多长?输入N,K然后输入N条绳子长度。答案保留两位小数。
思路:直接二分答案,长度为m时,如果切出来的段数大于等于k,那么就增大m,否则就减小。最小为0,最大为所有绳子长度和。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
const double eps = 1e-8;
int n, k, sum;
double a[MAXN];
int check(double m)
{
int cnt = 0;
for (int i = 0; i < n; i++) cnt += floor(a[i]/m);
return cnt;
}
int main()
{
while (~scanf("%d%d", &n, &k) && (n+k))
{
sum = 0.0;
for (int i = 0; i < n; i++) scanf("%lf", &a[i]), sum += a[i];
double L = 0, R = sum;
while (R - L > eps)
{
double m = L + (R-L)/2.0;
if (check(m) >= k) L = m;
else R = m;
}
printf("%.2f\n", L);
}
return 0;
}
/*
4 11
8.02
7.43
4.57
5.39
0 0
*/
通过二分查找算法解决从N条绳子中切割出K条相同长度的最大可能长度的问题。输入包括绳子的数量和目标数量及各绳子长度,输出保留两位小数。
615

被折叠的 条评论
为什么被折叠?



