这一题首先读懂题意啦,虽然很长,其实可以看作是天平放砝码,怎么样才能使两边的差值最小
这样一分析其实就很简单啦:
1)计算出两边现在的状态和:即:S=∑(m-i)*a[i]
这个时候就会出现两种情况:S>0或是S<0,分别代表左边的战力值高,或是右边的战力值高;
注意:这里需要将s1加入到总计算式中
2)枚举s2加入到每一个兵营后,我们现在的总状态,取出min 即可
细节技巧:
1.直接:a[p1] += s1;
2.通过题目的数据范围我们需要定义long long 类型
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 100005;
LL c[N],n,m,p1,s1,s2;
int main(){
scanf("%d",&n);
for(int i = 1; i<=n ;i++){
scanf("%d",&c[i]);
}
scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2);
c[p1] +=s1;
LL x = 0;
for(LL i = 1; i<=n; i++){
x += (m-i)*c[i];
}
LL mm = (x>0)?x:(-x),k=m;
for(LL i = 1;i<=n;i++){
LL xx = x+(m-i)*s2;
if(xx<0) xx = -xx;
if(xx<mm){
mm = xx;
k = i;
}
}
printf("%lld",k);
return 0;
}