龙虎斗

龙虎斗
龙虎斗
龙虎斗
龙虎斗
这题n的范围只有10510^5,所以暴力枚举p2p_2是不会超时的,主代码就是

if(abs(A+(long long)(m-i)*y-B)<sum)
            sum=abs(A+(long long)(m-i)*y-B),ans=i;
if(abs(B+(long long)(i-m)*y-A)<sum)
            sum=abs(B+(long long)(i-m)*y-A),ans=i;

p2/min枚举p_2之后让龙/虎加上他的代价,取min

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m,s,t,x,y,ans;
long long A,B,sum;
int p[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&p[i]);
    scanf("%d%d%d%d",&m,&s,&x,&y);
    p[s]=p[s]+x;
    for(int i=1;i<=m-1;i++)A+=(long long)p[i]*(m-i);
    for(int i=m+1;i<=n;i++)B+=(long long)p[i]*(i-m);
    sum=abs(A-B),ans=m;
    if(A<B)
    {
        for(int i=1;i<=m-1;i++)
        {
            if(abs(A+(long long)(m-i)*y-B)<sum)
            sum=abs(A+(long long)(m-i)*y-B),ans=i;
        }
    }
    else if(A>B)
    {
        for(int i=m+1;i<=n;i++)
        {
            if(abs(B+(long long)(i-m)*y-A)<sum)
            sum=abs(B+(long long)(i-m)*y-A),ans=i;
        }
    }
    printf("%d",ans);
    return 0;
}