洛谷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] 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;
}
原文地址:https://www.cnblogs.com/quanjun/p/12402805.html