poj1064(二分)

来源:互联网 发布:mysql select嵌套 编辑:程序博客网 时间:2024/05/18 01:02
/*题目是告诉你n根绳子,将其平均分为k等份,求出这个长度的值二分每份的长度判断是否等于k等份实时维护最大值*/#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;int type[15000];int main(){    int n, k;    while(scanf("%d%d", &n, &k) != EOF){        memset(type, 0, sizeof(type));        int maxx = 0;        for(int i = 0; i < n; i++) {            double x;            scanf("%lf", &x);            type[i] = x * 100;  //因为直接用double会有精度损失所以将其转化为一个int最终输出时转化回来即可很正常的一个二分            maxx = max(maxx, type[i]);        }        int l = 1, r = maxx, mid;       //注意这里最短是1题目已说        int res = 0;        double bb;        while(l <= r){            mid = (l+r) >> 1;            int cnt = 0;            for(int i = 0; i < n; i++)                cnt += type[i]/mid;            if(cnt < k){                r = mid - 1;            }            if(cnt >= k){   //这个题的二分判断条件就是等分的几个部分是否为k这里保存一下最大值即可                res = max(res, mid);                l = mid + 1;            }        }        printf("%.2f\n", (double)res / 100.00);    }    return 0;}

0 0
原创粉丝点击