题意:
给定一个长度为 n(n≤10^5 ) 的数列 {a_1,a_2,…,a_n},每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
分析:
LYD代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 100006;
ll a[N], b[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
b[1] = a[1];
for (int i = 2; i <= n; i++)
b[i] = a[i] - a[i-1];
ll p = 0, q = 0;
for (int i = 2; i <= n; i++)
if (b[i] > 0) p += b[i];
else if (b[i] < 0) q -= b[i];
cout << max(p, q) << endl << abs(p - q) + 1 << endl;
return 0;
}