差分数组 P4552 [Poetize6] IncDec Sequence
题目:
思路:利用差分数组
把第一个数当成差分数组的基数值,把其他项转换成0,就可以得到一个负数和 与一个正数和,因为每次只能加一和减一,所以如果正数大,最小次数就是正数次,如果负数的绝对值大,最小次数就是负数次
能得到多少种结果就是每次只能加一和减一之后 还剩余的次数, 所以找正数次的和与负数次的和的差值。
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxnum=3e5+5;
ll a[maxnum];
ll d[maxnum]; //差分数组
set<ll> m;
int main() {
int n;
cin >> n;
for(int i = 1 ; i<=n; i++)
cin >> a[i];
for(int i = 1 ; i<=n; i++){
d[i]=a[i]-a[i-1];
}
ll s=0,s2=0;
for(int i = 2 ; i<=n; i++){
if(d[i]>0)s+=d[i]; //差分数组正数和
else s2-=d[i];//差分数组负数和
};
cout<<max(s,s2) << endl <<abs(s-s2)+1; /* 因为每次只能加一和减一,
所以如果正数大,最小次数就是正数次,
如果负数的绝对值大,最小次数就是负数次*/
/*
每次只能加一和减一之后 还剩余的次数,还需要加上本身的一次
*/
return 0;
}