zoukankan      html  css  js  c++  java
  • 洛谷P4552 [Poetize6] IncDec Sequence 题解 差分数组

    题目链接:https://www.luogu.com.cn/problem/P4552

    解题思路:设差分数组 (d[i] = a[i] - a[i-1]),用 (sump) 表示所有 (gt 0)(d[i]) 之和;用 (sumn) 表示所有 (lt 0)(d[i]) 的绝对值之和。

    则因为一开始需要操作的是尽可能地消掉一个差分数组中的 (+1)(-1)。后期只需要消掉一个 (+1)(-1) 即可。所以:

    • 最少操作次数为 (max { sump, sumn })
    • 结果数为 (|sump - sumn| + 1)

    示例代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010;
    long long n, a[maxn], d[maxn], sump, sumn;
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        for (int i = 2; i <= n; i ++) {
            d[i] = a[i] - a[i-1];
            if (d[i] > 0) sump += d[i];
            else sumn += abs(d[i]);
        }
        cout << max(sump, sumn) << endl << abs(sump - sumn) + 1 << endl;
        return 0;
    }
    

    再简化一些的代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010;
    long long n, a[maxn], d, sump, sumn;
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        for (int i = 2; i <= n; i ++) {
            d = a[i] - a[i-1];
            if (d > 0) sump += d;
            else sumn += abs(d);
        }
        cout << max(sump, sumn) << endl << abs(sump - sumn) + 1 << endl;
        return 0;
    }
    
  • 相关阅读:
    第三次冲刺
    第二次冲刺
    第一次冲刺
    团队学习
    git and github
    还不够格的程序员
    CF1602F. Difficult Mountain
    线性基
    欧拉回路学习笔记
    莫比乌斯反演-学习笔记
  • 原文地址:https://www.cnblogs.com/quanjun/p/13663058.html
Copyright © 2011-2022 走看看