题解:洛谷 P4552 [Poetize6] IncDec Sequence

【题目来源】

洛谷:[P4552 Poetize6] IncDec Sequence - 洛谷

【题目描述】

给定一个长度为 \(n\) 的数列 \({a_1,a_2,\cdots,a_n}\),每次可以选择一个区间\([l,r]\),使这个区间内的数都加 \(1\) 或者都减 \(1\)

请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

【输入】

第一行一个正整数 \(n\)
接下来 \(n\) 行,每行一个整数,第 \(i+1\)行的整数表示 \(a_i\)

【输出】

第一行输出最少操作次数
第二行输出最终能得到多少种结果

【输入样例】

4
1
1
2
2

【输出样例】

1
2

【解题思路】

image

【算法标签】

《洛谷 P4552 IncDec Sequence》 #差分#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int n;                  // 数组长度
int a[100005];          // 原始数组
int b[100005];          // 差分数组
#define int long long   // 定义int为long long类型

signed main()
{
    // 输入数组长度
    cin >> n;
    
    // 输入原始数组
    for (int i = 1; i <= n; i++) 
    {
        cin >> a[i];
    }
    
    // 计算差分数组
    for (int i = 1; i <= n; i++) 
    {
        b[i] = a[i] - a[i - 1];
    }
    
    int p = 0, q = 0;  // p: 正差分和, q: 负差分和的绝对值
    
    // 计算正负差分和
    for (int i = 2; i <= n; i++) 
    {
        if (b[i] > 0)
        {
            p += b[i];  // 累加正差分
        }
        else
        {
            q += abs(b[i]);  // 累加负差分的绝对值
        }
    }
    
    // 输出结果
    cout << max(p, q) << endl;      // 输出最大操作次数
    cout << abs(p - q) + 1 << endl; // 输出可能的最终结果数
    
    return 0;
}

【运行结果】

4
1
1
2
2
1
2
posted @ 2026-02-18 21:16  团爸讲算法  阅读(0)  评论(0)    收藏  举报