题解 P5016 【龙虎斗】

首先祝各位大佬noip有个好成绩吧

当时比赛有个大数据,蒟蒻我暴力居然过了,好激动

这题一定要注意开long long
(那个大数据就是我开long long才过的)

还有刚开始应设置答案为m(见解析)

#include<iostream>
#include<cmath>
using namespace std;
long long f1,f2,f3;//计算初始双方气势 
long long a[100005],s1,s2;
int i,n,m,p1,ans;
int main()
{
    cin>>n;
    for (i=1;i<=n;i++) cin>>a[i];
    cin>>m>>p1>>s1>>s2;
    for (i=1;i<m;i++)
     {if(p1==i) a[i]+=s1; //如果是p1就直接加上计算 
       f1+=(m-i)*a[i];} 
    for (i=m+1;i<=n;i++)
     {if (p1==i) a[i]+=s1; 
       f2+=(i-m)*a[i];}
    long long cha=abs(f1-f2);//计算双方的差
    if (cha==0) {cout<<m; return 0;}
    //差已经为0,直接放在m处,m不属于任何一方
    ans=m;//若放置后差反而更大,应放m处
    for (i=1;i<m;i++)
      {
      f3=abs(f1+s2*(m-i)-f2);//计算新的差 
      if (f3<cha) ans=i,cha=f3;
      }
    for (i=m+1;i<=n;i++)
      {
      	f3=abs(f2+s2*(i-m)-f1);
        if (f3<cha) ans=i,cha=f3;
      }
    cout<<ans;
}
原文地址:https://www.cnblogs.com/Randolph68706/p/11194213.html