洛谷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;
}

猜你喜欢

转载自www.cnblogs.com/quanjun/p/12402805.html