zoukankan      html  css  js  c++  java
  • 洛谷 P5019 铺设道路(差分)

    嗯...

     

    题目链接:https://www.luogu.org/problem/P5019

     

    首先简化一下题意:

    给定一个长为N的数组,每次操作可以选择一个区间减去1,问最少多少次操作可以将数组中的数全变成0 N≤100000

    思路:

    首先对于第一个数字d_1我们至少需要在上面花d_i次,然后考虑每一个d_i,对于它比上一个数字小(或等于)的那一部分,

    我们可以在对上一个数字操作时一块操作。如果d_i > d_i - 1,也就是说它比上一个数大,那么我们就必须多进行d_i - d_i - 1次操作。

    很明显,数与数之间会有差,而差会造成一些区间问题,所以这道题的正解是差分...

    我们用b数组维护差分,然后将大于0的差分数组加到ans中即可。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 
     4 using namespace std;
     5 
     6 int ans, d[100005], b;
     7 
     8 int main(){
     9     int n;
    10     scanf("%d", &n);
    11     for(int i = 1; i <= n; i++){
    12         scanf("%d", &d[i]);
    13         b = d[i] - d[i - 1];
    14         if(b > 0) ans += b;
    15     }
    16     printf("%d", ans);
    17     return 0;
    18 }
    19     
    AC代码
  • 相关阅读:
    Kendo
    过河
    数组分组(简单dp)
    Codeforces Round #604 (Div. 2)(A-E)
    HDU1253
    HDU1026
    linux常用命令(二) --目录操作
    linux常用命令(一)--ls
    hdu 1072
    Codeforces Round #597 (Div. 2)(A-D)
  • 原文地址:https://www.cnblogs.com/New-ljx/p/11267087.html
Copyright © 2011-2022 走看看