洛谷P5016 龙虎斗 题解 简单模拟
题目链接: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] \times (m - i)
\]
虎队的气势和为
\[\sum_{i=m+1}^n c[i] \times (i-m)
\]
两队气势和之差为(这里算的是虎队的气势和-龙队的气势和)
\[\sum_{i=1}^n c[i] \times (i-m)
\]
而我如果在 \(p_2\) 位置放了 \(s_2\) 个工兵,则两队气势和之差会变成
\[s_2 \times (p_2 - m) + \sum_{i=1}^n c[i] \times (i-m)
\]
所以我们只需要从 \(1\) 到 \(n\) 去枚举 \(p_2\),然后找气势和之差的绝对值
\[| s_2 \times (p_2 - m) + \sum_{i=1}^n c[i] \times (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;
}