zoukankan      html  css  js  c++  java
  • 2018ICPC青岛 E

    ZOJ - 4062  

    题意:有n个植物排成一排,按顺序植物的编号是1-n,每个植物都有一个生长速率,有一个机器人,机器人可以走m步,每走一步,这个机器人就会浇一次水,浇一次水那个植物就会长

    自身的生长速率那么高,然后现在要求最大的最小生长值,

    思路:一般要求最大的最小值都是使用二分来求答案,我们二分出的答案做以下的测试

    我们先求出每个位置大于最小值至少到达此位置几步

    然后我们直接考虑当前位置是尽量往右走,走来回来增加此位置的生长速率,不过有很多细节,我们遇到负数的时候就不能往当前位置来回了,

    肯定是其他的方向路线来走,不过步数基本一样,所以我们可以模拟路线步数出来,然后注意不要爆了long long

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    ll n,m;
    ll a[100001];
    bool lower(ll x)
    {
        ll res=0,sum=0;
        for(int i=0;i<n;i++)
        {
            ll y=x/a[i]+(x%a[i]!=0)-res;
            if(y<=0)
            {
                if(i!=n-1) y=1;
                else y=0;
            }
            res=y-1;
            if(res<0) res=0;//如果当前的已经不需要来回了,就把右边的加上,
            sum+=res+y;//加了当前的还有旁边要走回的来回数
            if(sum>m) return false;
        }
        return true;
    }
    int main()
    {
        ll t;
        scanf("%lld",&t);
        while(t--)
        {
            scanf("%lld%lld",&n,&m);
            ll l=0,r=1e18;
            for(int i=0;i<n;i++)
            {
                scanf("%lld",&a[i]);
            }
            ll x=0;
            while(l<=r)//二分出答案
            {
                ll mid=(l+r)/2;
                if(lower(mid))
                {
                    x=mid;
                    l=mid+1;
                }
                else{
                    r=mid-1;
                }
            }
            printf("%lld
    ",x);
        }
    }
  • 相关阅读:
    硬件接口通信速度
    python socket非阻塞及python队列Queue
    pandaboard用wifi时打不开网页
    pandaboard安装ubuntu14.04系统遇到的问题
    创建ROS工作空间和包
    CAN 和 CANopen的区别和联系
    各种通信方式总汇
    ROS中的CMakeLists.txt
    备忘录模式
    class文件概述
  • 原文地址:https://www.cnblogs.com/Lis-/p/10115075.html
Copyright © 2011-2022 走看看