Problem Description
有n条绳子,它们的长度分别为ai。如果从它们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留到小数点后2位。
思路:
二分答案,判断是否满足,因为结果是小数,所以跑暴力。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 10005;
double a[maxn];
int k, n;
bool solve(double mid)
{
int ans = 0;
for(int i = 0; i < n; i++)
ans += (int)(a[i]/mid);
return ans >= k;
}
int main()
{
int i;
while(~scanf("%d %d", &n, &k))
{
for(i = 0; i < n; i++)
scanf("%lf", &a[i]);
double l = 0.00, r = 1500000.0;
for(i = 0; i < 100; i++)
{
double mid = (l+r)/2;
if(solve(mid))
l = mid;
else r = mid;
}
// floor函数返回参数不大于arg的最大整数
printf("%.2lf\n", floor(l*100)/100);
//printf("%.2lf\n", ((int)(l*100)/100.0));
}
return 0;
}