zoukankan      html  css  js  c++  java
  • P5016 龙虎斗

     这是题目,一看题目我懵了,怎么这么长 不想读

    但是把我仔细把题目读了几遍以后发现 也就是那么回事

    我觉得这题很简单,就是先输入,p1位置加s1个工兵,然后依次枚举把s2个工兵放在所有的兵营里,每次算一遍双方势力之差,取最小就行了

    但是写出来以后代码超时了

    超时的原因实在是太简单了

    原因在于每次都算了一遍势力之差。

    时间复杂度是O(n^2)O(n2)

    所以我考虑说

    就提前算好龙方和虎方的势力之差,每次枚举的时候就直接算一下新的势力之差就行

    本着不开long long见祖宗的原则 我写出了的AC代码就是下面这个了

    #include <bits/stdc++.h>
    #define max maxx 
    #define min minn
    #define ll long long
    using namespace std;
    ll n,c[100005],m,p1,s1,s2,p2;
    ll lon,hu;
    ll max(ll a,ll b)
    {
        if(a>b) return a;
        else return b;
    }
    ll min(ll a,ll b)
    {
        if(a<b) return a;
        else return b;
    }
    int main()
    {
        ll i;
        cin>>n;
        for(i=1;i<=n;i++) 
            cin>>c[i];
        cin>>m>>p1>>s1>>s2;
        c[p1]+=s1;
        for(i=1;i<m;i++)
            lon+=c[i]*(m-i);
        for(i=m+1;i<=n;i++)
            hu+=c[i]*(i-m);
        if(lon==hu)
            cout<<m<<endl;
        else if(lon<hu)
        {
            p2=m-(hu-lon)/s2;
            p2=max(1,p2);
            p2=min(n,p2);
            if(p2>1 && (abs(lon+s2*(m-p2+1)-hu)<=abs(hu-lon-s2*(m-p2))))
                cout<<p2-1<<endl;
            else cout<<p2<<endl;
        } 
        else
        {
            p2=m+(lon-hu)/s2;
            p2=max(1,p2);
            p2=min(n,p2);
            if(p2<n && (abs(hu+s2*(p2+1-m)-lon)<abs(hu+s2*(p2-m)-lon)))
                cout<<p2+1<<endl;
            else cout<<p2<<endl;
        }
        return 0;
    }
    

     拜拜!!!

  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/--840-114/p/12727460.html
Copyright © 2011-2022 走看看