poj 1064 Cable master(二分)
题目链接:http://poj.org/problem?id=1064
题意
有 N 条绳子,它们的长度分别为 Li 。如果从它们中切割出 K 条长度相同的绳子的话,这 K 条绳子每条最长能有多长?答案保留到小数点后 2 位。
思路
二分确认每次是否至少能切割出 K 条绳子。
代码
#include <cstdio> #include <cmath> const int MAX_N = 10010; const double INF = 1e6; int N, K; double L[MAX_N]; bool fit(double x) { int num = 0; for (int i = 0; i < N; i++) { num += (int)(L[i] / x); } return num >= K; } int main() { scanf("%d %d", &N, &K); for (int i = 0; i < N; i++) { scanf("%lf", &L[i]); } double lb = 0, ub = INF; for (int i = 0; i < 100; i++) { double mid = (lb + ub) / 2; if (fit(mid)) lb = mid; else ub = mid; } printf("%.2f\n", floor(ub * 100) / 100); }