首页 > 其他 > 详细

P5016

时间:2020-04-18 23:12:44      阅读:54      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

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

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

我觉得这题很简单,就是先输入,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;
}

 拜拜!!!

P5016

原文:https://www.cnblogs.com/--840-114/p/12727460.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!