7Cable master

简单题意

给出每个管子的长度,让你确定最长切割长度,把管子按照切割长度切成给定的数量

解题思路形成过程

用二分法在能保证数量的基础上求得最大值

感想

说真的题干略长,读的不是很明白,跟着模糊理解,看了看输入输出数据,测试了一下自己的方法,成立,就这样做了,不过在选切割长度上限的时候一开始选了最短的的长度作为上线,在杭电题库试了一下WA,才想起来其实要是能保证数量的话,短的管子可以舍弃,于是就选了平均长度作为上限。

AC代码

#include<iostream>

#include<stdio.h>
#include<fstream>
using namespace std;
double a[10005];
int main()
{
    //ifstream cin("in.txt");
    freopen("in.txt","r",stdin);
    int n,k;
    double high,low,mid;
    int cnt;
    while(scanf("%d%d",&n,&k)&&(n||k)){
        high=0;low=0;
        for(int i=0;i<n;i++){
            scanf("%lf",&a[i]);
            high+=a[i];
        }
        high/=k;
        while(high-low>1e-8){
            cnt=0;
            mid=(high+low)/2;
            for(int i=0;i<n;i++){
                cnt+=(int)(a[i]/mid);
            }
            if(cnt>=k)low=mid;
            else high=mid;
        }
            printf("%.2lf\n",mid);
    }
    return 0;
}

你可能感兴趣的:(二分算法)