zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    
  • 相关阅读:
    c# 时间操作
    JAVA file文件操作
    HttpServletRequest 转换成MultipartHttpServletRequest
    【日常笔记】java spring 注解读取文件
    【日常笔记】mybatis 处理 in 语句的使用
    购物车小程序
    Python中的r+和a+
    markdown基本语法
    markdown箭头的处理
    markdown中如何插入公式
  • 原文地址:https://www.cnblogs.com/quanjun/p/12402805.html
Copyright © 2011-2022 走看看