• BZOJ 3043


     

    Description

    给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。
    问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

    Input

    第一行一个正整数n 
    接下来n行,每行一个整数,第i+1行的整数表示ai。

    Output

    第一行输出最少操作次数
    第二行输出最终能得到多少种结果

    Sample Input

    4
    1
    1
    2
    2

    Sample Output


    1
    2

    HINT

    对于100%的数据,n=100000,0<=ai<2147483648

    题解:

    明显要求最后差分数列除第一项都是0的情况。然而为什么答案是只用统计上升和下降的差分呢????

    有个比较牵强的说法,>0的差分其实是指后面连续一段降的话只需要上升的差分这么多。

    而<0的话其实是把后面连续一段升高为相同高度所需的操作数。

    如果你升高的话只能连续升高,或下降的话只能连续下降。因为上升的话后面所有的数都上升了,如果你再下降的话,就会有重复的多余操作。下降同理。

    AC代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define N 100005
    int n;long long ans1,ans2,a[N];
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=2;i<=n;i++){
            if(a[i]>a[i-1]) ans1+=a[i]-a[i-1];
            else ans2+=a[i-1]-a[i];
        }
        printf("%lld
    %lld
    ",max(ans1,ans2),abs(ans1-ans2)+1);
        return 0;
    }
  • 相关阅读:
    2019年春季第四周作业
    第三周作业
    第二周作业
    最大值及其下标
    查找整数
    PTA3
    币值转换
    三位老师
    自我介绍
    poj 3278 Catch That Cow(bfs)
  • 原文地址:https://www.cnblogs.com/shenben/p/5677149.html
Copyright © 2020-2023  润新知