题目链接:https://www.luogu.com.cn/problem/P5016
解题思路
首先要考虑 “某一刻天降神兵,共有 (s_1) 位工兵突然出现在了 (p_1) 号兵营” 这一干扰条件。
这 (s_1) 位工兵某一刻天降,和他们一开始就在兵营中是等价的!所以我直接把 (s_1) 加到 (c_{p_1}) 当中去即可。然后接下来我们就不用考虑 (s_1) 和 (p_1) 了。
龙队的气势和为
[sum_{i=1}^{m-1} c[i] imes (m - i)
]
虎队的气势和为
[sum_{i=m+1}^n c[i] imes (i-m)
]
两队气势和之差为(这里算的是虎队的气势和-龙队的气势和)
[sum_{i=1}^n c[i] imes (i-m)
]
而我如果在 (p_2) 位置放了 (s_2) 个工兵,则两队气势和之差会变成
[s_2 imes (p_2 - m) + sum_{i=1}^n c[i] imes (i-m)
]
所以我们只需要从 (1) 到 (n) 去枚举 (p_2),然后找气势和之差的绝对值
[| s_2 imes (p_2 - m) + sum_{i=1}^n c[i] imes (i-m) |
]
最小的那个对应的就是 (p_2)。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, m, p1, p2;
long long c[maxn], s1, s2, sum, ans;
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> c[i];
cin >> m >> p1 >> s1 >> s2;
c[p1] += s1;
for (int i = 1; i <= n; i ++) sum += c[i] * (i - m);
for (int i = 1; i <= n; i ++) {
long long tmp = abs(sum + s2 * (i - m));
if (!p2 || ans > tmp) {
p2 = i;
ans = tmp;
}
}
cout << p2 << endl;
return 0;
}