题目不难,但是思路巧妙。

我们求出差分数组后,就变成了这三种操作

1.一个数加一
2.一个数减一
3.一个数加一的同时一个数减一

我们要让 \(2\) ~ \(n\) 变成 \(0\) ,设所有整数的和为 \(s1\) ,负数的和的绝对值为 \(s2\) ,则最少操作数为 \(max(s1, s2)\)

我们 \(min(s1, s2)\) 次就让 \(s1,s2\) 中的一个变成了 \(0\),剩余的 \(max(s1, s2) - min(s1, s2)\) 次可以对位置1操作,加上开始的值,一共有 \(max(s1, s2) - min(s1, s2) + 1\) 种取值。

#include<iostream>
#include<cstdio>
using namespace std;
int n, ans;
long long sum1, sum2;
const int N = 100010;
int a[N];
int main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i)scanf("%d", &a[i]);
	for (int i = n; i >= 1; --i)a[i] -= a[i - 1];
	for (int i = 2; i <= n; ++i)
		(a[i] > 0 ? sum1 : sum2) += a[i];
	sum2 = -sum2;
	cout << max(sum1, sum2) << endl << (max(sum1, sum2) - min(sum1, sum2)) + 1;
}