zoukankan      html  css  js  c++  java
  • P1577 切绳子(二分)

    思路:先来分析一下数据范围,是1e4个数据,但是,是double类型,结果不超过0.01那么在绳子最大的情况下,单纯的找正确答案暴力的话就是1e7的时间复杂度,再乘上1e4的数据,这样肯定不行。那么很容易想到二分,在找答案时使用二分的话就可以让时间复杂度下降到log(1e7)这是一个比较小的值,起码不超过128,这样,我们的时间复杂度就降了下来了。

      检验函数,就是单纯的假设答案x,去除以每个绳子看看能得到最后有几段sum, 如果sum>=k则说明,是可行的。至于是不是最后答案,这要交给二分模板。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    
    const int maxn = 1e4 + 10;
    int n, k, a[maxn], maxx, ans, mid;
    double p;
    
    bool check(int x){
        int sum = 0;
        for (int i = 1; i <= n; ++i)
            sum += a[i] / x;
        return sum >= k;
    }
    
    void half(){
        int l = 0, r = maxx;
        while (l <= r){
            mid = (l + r) >> 1;
            if (check(mid)){ l = mid + 1; }
            else r = mid - 1;
        }
        ans = r;
    }
    
    int main(){
        cin >> n >> k;
        for (int i = 1; i <= n; ++i)
            cin >> p, a[i]=p*100,maxx=max(maxx, a[i]);
        half();    //二分
        printf("%.2lf
    ", (double)ans / 100);
    }
  • 相关阅读:
    Jmeter四种参数化方式
    微信公众号开发--服务器接入
    IIS调试程序
    vs连接GitHub
    vs2013 卸载
    Edge,IE浏览器 兼容模式设置
    XML非法字符的处理
    SQL Server Union联合查询
    SQL Server NULL的正确用法
    SQL Server Like 与 通配符
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10459801.html
Copyright © 2011-2022 走看看