提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
增减序列(差分)
题目:
给定一个长度为 n 的数列 a1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
思路:
设差分数组a[n],该题意下差分数组的操作为对a[i] + 或 - 1,之后在a[j] 同时 - 或 + 1,那么利用贪心,计算出所有大于0(后者比前者大)之和,和所有小于0(后者比前者小)之和,这两个当中最大值便是最小操作次数
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
long long num[110000];
int main()
{
long long n;
cin>>n;
for(int i = 1;i <= n;i++)
{
cin>>num[i];
}
long long x;
long long pos = 0,neg = 0;
for(int i = 2;i <= n;i++)
{
x = num[i] - num[i - 1];
if(x > 0)
{
pos += x;
}
else
{
neg -= x;
}
}
cout<<max(pos,neg)<<endl;
cout<<abs(pos - neg) + 1;
return 0;
}