• 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;
    }
    

     拜拜!!!

  • 相关阅读:
    QuickSort(快速排序)原理及C++代码实现
    MergeSort(归并排序)原理及C++代码实现
    InsertionSort(插入排序)原理及C++代码实现
    基于STC89C516的多游戏实现
    环境变量之classpath配置和临时配置
    搭建Java开发环境之配置环境变量
    一本糊涂账项目
    获取目录-Winform
    读取注册表-64位
    拦截窗体关闭、最大、最小事件
  • 原文地址:https://www.cnblogs.com/--840-114/p/12727460.html
Copyright © 2020-2023  润新知