洛谷4552 差分

题目链接

  https://www.luogu.com.cn/problem/P4552

题意

  给定一数列,问至少变换多少次后可以得到一个所有数都相等的数列,输出次数和数列种数

分析

  单纯要是想对这个数列进行操作就十分麻烦,所以我们考虑换个角度,让所有数都相等的意思不就是让它的差分数组除了下标为1的位置外都是0吗,而又要求变换最少次,对一个区间进行变换,需要在l的位置±1,r+1的位置±-1,所以我们需要对一个负数和一个正数同时操作,当只剩下一种数的时候,我们可以将r当成n或者将1当成l,所以变换的最少次数就是负数和正数中总数最大的那个,再考虑种数,一个负数与一个正数相消是不会影响种数的,所以要取得最大种数,只能是将正数或负数中的一类全部消完,这样后才能对1的位置进行修改,从而改变整个数列,最后别忘了加上不进行修改的种类。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+1;
int a[N],b[N];
int main(){
    int n;
    long long s1,s2;//不开long long见祖宗
    s1=s2=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    b[1]=a[1];
    for(int i=2;i<=n;i++){
        b[i]=a[i]-a[i-1];
        if(b[i]>0)s1+=b[i];
        else s2-=b[i];
    }
    printf("%lld\n%lld",max(s1,s2),abs(s1-s2)+1);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/anyixing-fly/p/12445558.html