zoukankan      html  css  js  c++  java
  • Codeforces GYM 100738C Rating Shuffle

    传送门:http://codeforces.com/gym/100738/problem/C


    ac程序:

    //库省略
    #define ft first
    #define sd second
    #define np next_permutation
    #define ll long long
    #define pb push_back
    using namespace std;
    ll n,d;
    int a[100005];
    bool ok;
    bool check(ll mid)
    {
        ll fir=a[1]+d*mid;
        for(int i=2;i<=n;i++)
        {
            ll t=a[i]+d*mid;
            if(t<fir)
            {
                fir=t;
                continue;
            }
            ll times=(t-fir)/d/2+1;
            if(times>mid)
            {
                return false;
            }
            fir=t-d*times*2;
        }
        return true;
    }
    int main()
    {
        cin>>n>>d;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>=a[i-1] && !ok)
                ok=true;
        }
        if(!ok)
        {
            cout<<0;
            return 0;
        }
        ll l=0,r=1e18;
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            if(check(mid))
                r=mid-1;
            else
                l=mid+1;
        }
        cout<<l;
        return 0;
    }

    思路:
    首先这是一道裸裸的二分题,单调性明显,主要问题就是数据范围,在10的18的数据范围里二分查找,其实并不用担心,10的18次方也最多只要60次二分就够了,再加上10的5次方的check,只有6*10的6次方,完全是可以过的。

    但是我仍然超时了无数次。

    罪魁祸首,始作俑者就是cin
    原本以为10的5次方的数据范围不需要scanf,结果就是需要,10的5次方的读入再加上后面那个玩意就会超时,所以,我决定
    要不以后就只写scanf吧。。。。。。

  • 相关阅读:
    录制游戏视频——fraps
    ssh 带端口登录
    You have new mail in /var/spool/mail/root 烦不烦你?
    php生成xml的四种方法(转)
    liunx命令之whereis、which、find的区别和联系
    wancms从apache迁移至nginx
    面试题
    NP
    Careercup | Chapter 7
    OS | 哲学家问题
  • 原文地址:https://www.cnblogs.com/NightRaven/p/9333255.html
Copyright © 2011-2022 走看看