题目链接
AcWing 100.
分析:
区间操作,先转化为差分数组形式,那么最终答案的差分数组应该是 x 0 0 0 0 0 0 ... 的形式。
题目转化为:每次让差分数组的一个位置+1(或-1),另一个位置-1(或+1),位置的范围可以选择[1,n+1]
(1)使数组达到目标形式的次数最少
容易想到一种贪心的策略:
当数组中不存在负数时:一个位置选择非0的[2,n]的位置,另一个位置选择1或n+1即可。
当数组中不存在正数时:同理。
当数组中正负数都存在时:先每次选择一正一负,直到正数选完或者负数选完,再按照上面的方法选。
(2)最终可能得到的数组数量即为对位置1操作的次数+1.
代码:
/*
区间操作,先转化为差分数组形式,那么最终答案的差分数组应该是 x 0 0 0 0 0 0 ... 的形式。
题目转化为:每次让差分数组的一个位置+1(或-1),另一个位置-1(或+1),位置的范围可以选择[1,n+1]
(1)使数组达到目标形式的次数最少
容易想到一种贪心的策略:
当数组中不存在负数时:一个位置选择非0的[2,n]的位置,另一个位置选择1或n+1即可。
当数组中不存在正数时:同理。
当数组中正负数都存在时:先每次选择一正一负,直到正数选完或者负数选完,再按照上面的方法选。
(2)最终可能得到的数组数量即为对位置1操作的次数+1.
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
int main()
{
std::ios::sync_with_stdio(false);std::cin.tie(nullptr);
int n;
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=n;i>=1;i--) a[i] -= a[i-1];
ll p1 = 0,p2 = 0;
for(int i=2;i<=n;i++){
if(a[i]>0) p1 += a[i];
else if(a[i]<0) p2 -= a[i];
}
ll ans = max(p1,p2);
cout << ans << '\n' << (abs(p1-p2)+1) << '\n';
return 0;
}