題目描述
給定一個長度為 n?的數列 a_1,a_2,...,a_n,每次可以選擇一個區間[l,r],使這個區間內的數都加 1?或者都減 1。?
??
請問至少需要多少次操作才能使數列中的所有數都一樣,并求出在保證最少次數的前提下,最終得到的數列有多少種。
輸入格式
第一行一個正整數 n? ?
接下來 n?行,每行一個整數,第 i+1 行的整數表示 a_i。
輸出格式
第一行輸出最少操作次數 ??
第二行輸出最終能得到多少種結果
樣例 #1
樣例輸入 #1
4
1
1
2
2
樣例輸出 #1
1
2
提示
對于 100%?的數據,n<=?100000, 0 <=?a_i <=?2^31。
代碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL; // 定義 long long 類型的別名為 LL
LL n, c, p, q, a[100010]; // 聲明變量int main()
{cin >> n; // 輸入數組的長度 nfor (int i = 1; i <= n; i++){scanf("%lld", &a[i]); // 輸入數組的元素}for (int i = 2; i <= n; i++) // 從第二個元素開始遍歷數組{c = a[i] - a[i - 1]; // 計算相鄰元素之間的差值if (c > 0) // 如果差值大于 0,說明需要增加操作{p += c; // 累加增加操作次數}else // 否則,需要減少操作{q -= c; // 取反后累加減少操作次數}}LL ans1 = max(p, q); // 找到增加和減少操作次數中的較大值,作為最少操作次數LL ans2 = abs(p - q) + 1; // 計算操作次數之差的絕對值加 1,作為最終可能的結果種數cout << ans1 << endl << ans2; // 輸出最少操作次數和結果種數return 0; // 程序結束
}