題解 P5016 【龍虎鬥】

首先祝各位大佬noip有個好成績吧ios

當時比賽有個大數據,蒟蒻我暴力竟然過了,好激動大數據

這題必定要注意開long long
(那個大數據就是我開long long才過的)spa

還有剛開始應設置答案爲m(看法析)code

#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;
}
相關文章
相關標籤/搜索