C - 前后缀——IncDec Sequence
Description
给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。
问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。Input
第一行一个正整数n
接下来n行,每行一个整数,第i+1行的整数表示ai。
。Output
第一行输出最少操作次数
第二行输出最终能得到多少种结果Sample Input
4
1
1
2
2
Sample Output
1
2
Hint
对于100%的数据,n=100000,0<=ai<2147483648
Source
Poetize6
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int a[100005];
int main() {
ll n;
cin >> n;
for (int i = 1; i <= n; i++)//存入
cin >> a[i];
ll u = 0, d = 0;
for (int i = 2; i <= n; i++) {
ll c = a[i] - a[i - 1];//计算差分
if (c > 0)
u += c;//大于零的差分+差值
if (c < 0)
d -= c;//小于零的差分-差值(为正)
}
cout << max(u, d) << endl;//按两者最大的计算,大的决定此数
cout << abs(u - d) + 1;//当两者相等时,有基础可能1种,每当两者多差1,
//就代表有一个“阶”可以被操作,最终结果就会多一种
return 0;
}