• C港口 (差分数组)(第十五届中北大学算法与程序设计竞赛)


    题目链接:https://ac.nowcoder.com/acm/contest/5188/C

    题目大意:长度为n的数列,每次可以选择一个区间,使区间的每一个数+1或-1

    问最少几次操作后,所有的数相等。

    题解:差分

    当所有的数都相等后,差分数组除了第一个数都为0.

    当给区间[L,R]中的每个数+1,即将差分数组cf[L]++,cf[R+1]--,

    当给区间[L,R]中的每个数-1,即将差分数组cf[L]--,cf[R+1]++,

    所以本题转换为对差分数组执行最少的操作次数,使差分数组除第一个数都变为0.

    当给差分数组中正的-1时,就对差分数组中负的+1,这样操作次数最少。

    结果为 差分数组中负数的和 与 正数的和绝对值大的为答案。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 100009
    #define LL long long
    using namespace std;
    
    int n;
    
    LL w[N];
    LL gg,pp;
    
    int main()
    {
        scanf("%d",&n);
        cin>>w[1];
        if(n==1)
        {
            if(w[1]>0) cout<<w[1];
            else cout<<-1*w[1];
            return 0;
        }
        for(int i=2;i<=n;i++)
        {
            scanf("%lld",&w[i]);
            LL c=w[i]-w[i-1];
            if(c>0) gg+=c;
            else pp-=c;
        }
        cout<<max(gg,pp);
        return 0;
    }
    /*
    5 4 0 -2 -1
    5 3 0 -1 -1
    5 2 0 0 -1
    5 1 0 0 0 
    5 0 0 0 0
    */ 
    View Code
  • 相关阅读:
    数据库基础
    Junit单元测试、反射与注解
    Stream流
    Java IO所用类
    字符集
    Lambda表达式
    【jdk1.8源码分析】LinkedHashMap
    线性表
    【jdk1.8源码分析】ArrayList
    java学习血泪史
  • 原文地址:https://www.cnblogs.com/zzyh/p/14479717.html
Copyright © 2020-2023  润新知