切绳子

题目描述
有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的
绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位。
输入格式:
第一行两个整数N和K,接下来N行,描述了每条绳子的长度Li。
输出格式:
切割后每条绳子的最大长度。

显然二分答案。。但是要注意。。对小数的处理。。因为这个WA了好几次。

#include
using namespace std;

const int MAXN=10005;

int n,k,a[MAXN],maxx=0,minn=1e8+10;

bool ch(int l,int r){
    int mid=(l+r)>>1,sum=0;
    for(int i=1;i<=n;i++){
        sum=sum+(a[i]/mid);
    }
    if(sum>=k)return 1;
    else return 0;
}

float tem1;

int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%f",&tem1);
        a[i]=tem1*100;
        maxx=max(maxx,a[i]);
    }
    minn=0;
    while(minn+1!=maxx){
        if(ch(minn,maxx)){
            minn=(minn+maxx)>>1;
        }
        else maxx=(minn+maxx)>>1;
    }
    int sum=0;
    for(int i=1;i<=n;i++){
        sum=sum+(a[i]/maxx);    
    }
    if(sum>=k)printf("%.2f",maxx*0.01);
    else printf("%.2f",minn*0.01);
    return 0;
}

你可能感兴趣的:(二分答案,贪心)