龙虎斗

· · 题解

龙虎斗

思路:枚举

实现方法:按位枚举

结果:正确

#include<bits/stdc++.h>//开库
#define ll long long//运用define将long long定义为ll
using namespace std;//开辟名字空间
ll i,j,k,n,m,p1,s1,s2;
ll a[100010],x,y;//以上都是定义
int main(){
    cin>>n;
    for(i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    cin>>m>>p1>>s1>>s2;//以上为输入
    a[p1]+=s1;//在p1神兵天降s1人
    for(i=1;i<=n;i++){
        if(i<m)x+=(m-i)*a[i];
        if(i>m)y+=(i-m)*a[i];
    }//计算轩轩、凯凯方士气
    ll ans=1e22,num=1e22;//先最大化
    for(i=1;i<=n;i++){//枚举派兵位置
        if(i<m)x+=(m-i)*s2;//派给轩轩
        if(i>m)y+=(i-m)*s2;//派给凯凯
        ll u=abs(x-y);//计算轩轩、凯凯之差
        if(u<ans){
            ans=u;
            num=i;
        }//若此时枚举的士气差小于最小值,更新答案
        if(i<m)x-=(m-i)*s2;//复原
        if(i>m)y-=(i-m)*s2;//复原
    }
    printf("%d",num);//输出
    return 0;
}