区间加减操作,容易想到差分,最终要让n个数相同,则差分数组b2~bn变成0;
题目转化成:对于数列b1~bn+1, 每次选择两个数,一个加一,一个减一,最终使b2~bn变成0。
1.优先选择下标为2~n的操作。
2.选择b1和2~n中的数操作。
3.选择bn+1和2~n中的数操作。
先进行操作一,正负值(x, y)抵消后可能还会有剩余,然后选择操作2或操作3即可。
最小操作次数:min(x, y)+ abs(x - y)
可能的情况:即看最终b1的取值有几种可能,abs(x - y)+ 1
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100005;
int a[N], b[N], n;
signed main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
b[i] = a[i] - a[i - 1];
}
int x = 0, y = 0;
for (int i = 2; i <= n; i ++) {
if (b[i] > 0) x += b[i];
if (b[i] < 0) y -= b[i];
}
int k = abs(x - y);
cout << min(x, y) + k << endl;
cout << k + 1 << endl;
return 0;
}
627

被折叠的 条评论
为什么被折叠?



