POJ 1064 Cable master 题解

题目

题目链接

POJ 1064 Cable master

题目大意

提供\(N\)个绳子,要求分成\(K\)个长度相同的绳子,问分后的绳子最大长度为多少?

题解

假设最后绳子长为\(x\)

  • 如果这\(n\)个绳子能分成\(k\)个长度为\(x\)的绳子,则\(x\)可行,然后将\(x\)变大,再次进行判断。
  • 如果这\(n\)个绳子不能分成\(k\)个长度为\(x\)的绳子,则\(x\)不可行,然后将\(x\)变小,再次进行判断。

这样下去,总会找到最大的可行的\(x\),也就是答案。问题是,如何快速的找到\(x\),可看到,问题就在\(x\)的变大变小,如果变化的合适,将很快能接近答案。

这里可以使用二分法。初始条件为\(lb=0,\, ub=max(l_i),\, x=\frac{(lb+ub)}{2}\)

每次根据\(x\)可行与否,来变化\(lb\)或者\(ub\)

Then show the code.

#include <cstdio>
#include <cmath>

int n, k;
double l[(int)1e4+5];

bool check(double x){
    int num=0;
    for(int i=1; i<=n; i++)
        num += (int)(l[i]/x);
    return num >= k;
}

int main(){
    scanf("%d%d", &n, &k);
    for(int i=1; i<=n; i++)
        scanf("%lf", &l[i]);
    //绳子最长为1e5
    double lb=0, ub=1e5+5;
    //循环100次 确保最后结果足够小
    for(int i=0; i<100; i++){
        double mid = (lb+ub)/2;
        if(check(mid)) lb = mid;
        else ub = mid;
    }
    //防止浮点数有精度问题
    printf("%.2lf\n", floor(lb*100)/100);
    return 0;
}
posted @ 2021-02-23 10:46  1v7w  阅读(58)  评论(0编辑  收藏  举报