分析
算出龙方和虎方气势差tot
若tot=0 p2=m
若tot>0 i=m-tot/s2; j=i-1; 把p2放在i或j上(比较放在哪个位置使最后气势差最小)
若tot<0 i=m+tot/s2; j=i+1。i=min(n,i);j=min(n,j)。同理把p2放在i或j上。
代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
ll n,m,p1,s1,s2,ans;
ll a[N];
ll read(){
ll sum=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
sum=(sum<<3)+(sum<<1)+ch-'0';
ch=getchar();
}
return sum*f;
}
int main(){
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
m=read();
p1=read();
s1=read();
s2=read();
ll tot=0;
for(int i=1;i<=n;i++)
tot+=(m-i)*a[i];
tot+=s1*(m-p1);
if(tot==0){
ans=m;
}
else{
ll i,j,c1,c2;
if(tot<0){
tot=-tot;
i=m-tot/s2;j=i-1;
if(i<1)i=1;if(j<1)j=1;
if(i==j)ans=i;
else{
c1=abs((m-i)*s2-tot);
c2=abs((m-j)*s2-tot);
if(c1<c2)ans=i;
else ans=j;
}
}
else{
i=m+tot/s2;j=i+1;
i=min(n,i);j=min(n,j);
if(i==j)ans=i;
else{
c1=abs(tot-(i-m)*s2);
c2=abs(tot-(j-m)*s2);
if(c1<c2)ans=i;
else ans=j;
}
}
}
cout<<ans;
return 0;
}