P4552 [Poetize6] IncDec Sequence - 洛谷
差分+贪心
根据题目:一段区间都加1或减1 , 可以想到差分
构建差分数组:sub 我们要让除了sub[1] , 其他全是0
我们可以的操作是:l+1 , r-1 or l-1 , r+1 or 一个数+1 / -1
所以找到 一对正负数 就可以消掉 小的那个数
消掉剩下消不掉的 , 就自己单独消掉
所以 最少操作 : max( sum_p , sum_n )
种类数:此时diff = abs(sum_p - sum_n ) 剩下不可用一对正负数消掉的,需要自己消掉的数
if diff < 0 , 可以给sub[1] 减去(1 - diff) 还要+上原来的sub[1]
if diff > 0 , 可以给sub[1] 加(1 - diff) 还要+上原来的sub[1]
sub[1]是多少整个数组最后就是多少 , 所以有 diff +1 种
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
int n;
cin >> n;
vector<int> a(n+1,0);
vector<int> sub(n+1,0);
for(int i=1;i<=n;i++){
cin>>a[i];
sub[i] = a[i] - a[i-1];
}
int sum_p = 0 , sum_n = 0;
for(int i=2;i<=n;i++){
if(sub[i] >= 0){
sum_p += sub[i];
}
else{
sum_n += sub[i];
}
}
sum_n = -sum_n;
cout<<max(sum_p , sum_n)<<endl;
cout<<abs(sum_p - sum_n)+1<<endl;
return 0;
}