zoukankan      html  css  js  c++  java
  • IncDec Sequence(差分)

    题意:给定一个序列,可以对一个区间进行加1或减1的操作,问最少需要多少次可以将序列的值一样.

    Solution

    我们将序列差分,得到一个差分数组。

    对于每一个区间操作,我们可以把它转化为在查分数组上某个位置+1,某个位置-1,范围1-n+1。

    目标是除了第一个数之外其他数都为零(这样所有前缀和都相等,满足所有数字都一样的条件)。

    (既然不管第一个数,那我们干脆从2开始差分就好了。)

    那我们把正数和负数对着消,最后会剩下一些数。

    对于这些数,我们有两种选择,一个是和一消,一个是和n+1消。

    所以次数是max(正查分和,负差分和)种类数就是(abs(正查分和-负差分和)+1)

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #define N 100002
    using namespace std;
    typedef long long ll;
    ll a[N],ans1,ans2,ans3;
    int n;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
        for(int i=2;i<=n;++i){
            ll c=a[i]-a[i-1];
            if(c>0)ans1+=c;
            else ans2-=c;
        }
        ans3=max(ans1,ans2);
        printf("%lld
    %lld",ans3,abs(ans1-ans2)+1);
        return 0;
    }
  • 相关阅读:
    source insight 使用介绍
    android 自定义progressBar
    appium环境安装
    js定义类的三种方法
    对象,函数,构造函数this,原型
    mindjet使用技巧
    在wamp下安装bugfree
    QTP
    powerdesigner使用
    随笔
  • 原文地址:https://www.cnblogs.com/ZH-comld/p/9673056.html
Copyright © 2011-2022 走看看