100. 增减序列差分 / 思维
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100. 增减序列差分 / 思维相关的知识,希望对你有一定的参考价值。
本题考察的是差分的思想。
设 b[i]=a[i]-a[i-1]
因为我们要想让其所有的数字都相等。故即b[2],b[3].......b[n]
都得为0才行。
此时数组所有的数的值都是b[1]。
因为我们的差分操作是每次选两值,让其一个加1,一个减1,基于贪心的思想正负数相互结合。
剩下的即为同符号的数。
设b[2]…b[n]中正数的和为sum1,负数的和为sum2
故最少的操作次数就是max( sum1, abs(sum2) )
那么结果的种类为,其实结果的种类就是b[1]的取值有多少个,可以得出有abs(sum1)-abs(sum2)
种情况再加上b[1]不变本身的这种情况
故一共有abs(abs(sum1)-abs(sum2))+1
种.
举一个最简单的例子。假如上面的正负数结合后还有一个正数3未解决。
那么可以 b[1]不变,让3和 b[n+1]结合
可以让b[1]变1次,让2和 b[n+1]结合
可以让b[1]变2次,让1和 b[n+1]结
可以让b[1]变3次,让0和 b[n+1]结
故b[1]一共有四种结果
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],b[N],n;
LL sum1,sum2;
int main(void)
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i]-a[i-1];
for(int i=2;i<=n;i++)
if(b[i]>=0) sum1+=b[i];
else sum2+=b[i];
cout<<max(sum1,abs(sum2))<<endl;
cout<<abs(abs(sum1)-abs(sum2))+1<<endl;
return 0;
以上是关于100. 增减序列差分 / 思维的主要内容,如果未能解决你的问题,请参考以下文章