将差分数组中所有的正数相加求和记作a,所有的负数相加求和记作b(此处负数的和为正值)
假设a = 5, b = 6那么正数5和负数5可以抵消,剩下的1进行一次+1/-1操作,此时共进行了min(a, b) + abs(a - b) = max(a, b)次
对于结果的种类,因为数列中的数全部一样,即b[2] - b[n]全部为0,即a[1] - a[n]全部相等,那么就转化为a[1]有几种可能的结果
最终序列a可能会有abs(a−b)+1种情况
#include <iostream> #include <cmath> #include <algorithm> using namespace std; typedef long long LL; const int N = 100010; int a[N]; int main() { int n; cin >> n; for(int i = 1; i <= n; ++ i) cin >> a[i]; for(int i = n; i >= 2; -- i) a[i] -= a[i - 1]; LL pos = 0, neg = 0; for(int i = 2; i <= n; ++ i) { if(a[i] > 0) pos += a[i]; else if(a[i] < 0) neg -= a[i]; } cout << max(pos, neg) << endl; cout << abs(pos - neg) + 1 << endl; return 0; }