题意:有N条绳子,他们的长度分别是Li。如果从他们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留2位小数。(例题)
1 <= 10N, 10K, Li <= 1000000
http://poj.org/problem?id=1064
思路:假定一个解并判断是否可行。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAX_N = 10000, INF = 100000+1;
int N, K;
double a[MAX_N+1];
bool C(double x)
{
int num = 0;
for(int i = 0; i < N; i++)
num += (int)(a[i] / x);
return num >= K;
}
void solve()
{
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("%lf\n", r);
printf("%.2lf\n", floor(l*100)/100);
}
int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d %d", &N, &K);
for(int i = 0; i < N; i++)
scanf("%lf", a+i);
solve();
return 0;
}