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. 增减序列差分 / 思维的主要内容,如果未能解决你的问题,请参考以下文章

AcWing100 增减序列(差分)

AcWing100 增减序列 (差分)

差分例题-增减序列

算法刷题AcWing 100. 增减序列——差分

100. 增减序列

第六章 基础算法