• Voltage Keepsake CodeForces


    题目链接

    这是一道很棒的二分题。

    思路:

    首先先思考什么情况下是可以无限的使用,即输出-1.

    我们思考可知,如果每一秒内所有设备的用电量总和小于等于充电器每秒可以充的电,那么这一群设备就可以无限使用。

    接下来分析不是无限使用的情况:

    题目要求的是满足某个情况的最大值。

    很像二分的类型,二分题目往往就是求某一个满足情况的最值,这样我们只需要寻找上限和下限,并对每一次mid值进行检验是否满足,这样的模型时间度一般为O(  N*Log( L ))

    L代表的是总区间的长度,而N代表的是完成一次判定需要的时间,一般题目可以O(N)进行暴力判断一个值是否满足情况。

     

    那么接下来我们来分析此题目,分析在条件区间内是否单调,显然可知的单调的,因为随着设备使用的最大时间的变大,对充电器每秒可以充的电值的要求也变大。

    判定的话,我们即要判断该最大使用时间的情况下,需要充电器每秒可以充值多少电,如果这个充电量小于等于题目给定的P值,那么就代表数据给的充电器可以满足这个任务,那么区间就可以选到 Mid-R这个区间进行再次查找。

     

    本题目要求精度准确到至少1e-4,我开的eps为1e-6,保险一点,

    然后区间我们定为 0~ 1e10

    这个区间是需要自己分析的,左区间值0,不用多说,右区间值即最大的值,需要用题目的数据范围进行分析,初始我认为P的最大值为1e9,那么上限也应该是1e9,但是wa了一次,改成1e10就AC了。

    然后我再次分析了一下数据范围,当极限数据,1e5个设备,每一个耗能为1,自带1e5的电,充电器的功率为1e5-1 ( 不 -1 的话就可以无限使用了)

    这个数据情况下,我们可以知道,答案是大于1e9,小于1e10的,所以我们以1e10做峰值。

    带精度问题的二分的方法有两种,可以见这篇博客。点我

    附上我的AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb std::ios::sync_with_stdio(false)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define gg(x) getInt(&x)
    #define eps 1e-6
    using namespace std;
    typedef long long ll;
    inline void getInt(int* p);
    const int maxn=1000010;
    const int inf=0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    struct node
    {
        int h;
        int x;
    }a[maxn];
    int n,p;
    bool check(double mid)
    {
        double need=0.0000;
        double sum=0.00000;
        repd(i,1,n)
        {
            need=mid*a[i].x-a[i].h;
            if(need>0.0000000)
            {
                sum+=need;
            }else
            {
    
            }
        }
        return 1.000000*mid*p-sum>0.000000;
    }
    int main()
    {
        gg(n),gg(p);
        ll sum=0ll;
        repd(i,1,n)
        {
            gg(a[i].x);
            gg(a[i].h);
            sum+=(1ll*a[i].x);
        }
        if(sum<=p)
        {
            printf("-1
    ");
        }else
        {
            double l=0.0000;
            double r=1e10;
            double mid;
            double ans;
            while(r-l>eps)
            {
                mid=(r+l)/2.00000;
                if(check(mid))
                {
                    l=mid;
                    ans=l;
                }else
                {
                    r=mid-eps;
                }
            }
            printf("%.5lf
    ", ans);
        }
    
        return 0;
    }
    
    inline void getInt(int* p) {
        char ch;
        do {
            ch = getchar();
        } while (ch == ' ' || ch == '
    ');
        if (ch == '-') {
            *p = -(getchar() - '0');
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 - ch + '0';
            }
        }
        else {
            *p = ch - '0';
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 + ch - '0';
            }
        }
    }
    View Code

    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    innodb count优化测试
    基于HTML5 Canvas生成粒子效果的人物头像
    基于HTML5 SVG炫酷文字爆炸特效
    一款基于jQuery轮播切换焦点图,可播放多张图片
    基于Bootstrap的jQuery开关按钮组合
    基于jQuery上下切换的焦点图—带缩略图悬浮
    基于HTML5 Canvas实现的图片马赛克模糊特效
    基于jQuery的宽屏可左右切换的焦点图插件
    基于HTML5的捕鱼达人游戏网页版
    基于HTML5实现的中国象棋游戏
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/10236751.html
Copyright © 2020-2023  润新知