欢迎光临散文网 会员登陆 & 注册

P5019 [NOIP2018 提高组]铺设道路

2023-01-28 20:12 作者:薄荷硬糖酱  | 我要投稿

题目:

题目背景

NOIP2018 提高组 D1T1

题目描述

春春是一名道路工程师,负责铺设一条长度为 n 的道路。

铺设道路的主要工作是填平下陷的地表。整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di 。

春春每天可以选择一段连续区间 [L,R] ,填充这段区间中的每块区域,让其下陷深度减少 11。在选择区间时,需要保证,区间内的每块区域在填充前下陷深度均不为 00 。

春春希望你能帮他设计一种方案,可以在最短的时间内将整段道路的下陷深度都变为 00 。

输入格式

输入文件包含两行,第一行包含一个整数 n,表示道路的长度。 第二行包含 n 个整数,相邻两数间用一个空格隔开,第 i 个整数为 di 。

输出格式

输出文件仅包含一个整数,即最少需要多少天才能完成任务。

输入输出样例

输入 

6   4 3 2 5 3 5

输出

9

说明/提示

【样例解释】

一种可行的最佳方案是,依次选择: [1,6][1,6][1,6][1,6][1,2][1,2][1,1][1,1][4,6][4,6][4,4][4,4][4,4][4,4][6,6][6,6][6,6][6,6]

【数据规模与约定】

对于 30%30% 的数据,1n10 ;
对于 70%70% 的数据,1n1000 ;
对于 100%100% 的数据,1n100000,0di10000 。

题目大意:

输入数字n,表示数组的长度,每次只能在一个连续的区间里全部减1,直到全部为0为止,最少操作多少次

思路:

考了贪心算法

从第一个数字开始来判断下一步到底需不需要加操作次数,先记录第一个坑要操作多少次(这个操作数是只可能增加不可能减少的,操作次数肯定会至少大于等于全部坑深度里面最深的那一个坑的深度),与第二个坑的深度作比较,有两种情况:

1)第二个坑比第一个坑大

填第一个坑的时候会连着填了一点第二个坑,第二个坑没填完要继续填,所以要加操作数:

操作数[i-1]=操作数[i]+坑[i]-坑[i-1];

2)第二个坑小于等于第一个坑

填一个坑的时候第二个坑也已经被连着填完了,所以不需要增加操作数:

操作数[i]=操作数[i-1];

循环……

输出最后的操作数

易错点:

不知道怎么写,我直接看了别人的题解(采购一个)

代码:

#include <iostream>

using namespace std;

int ans[100005],rode[100005],n;

int main()

{

    cin>>n;

    for(int i=0;i<n;i++)cin>>rode[i];

    ans[0]=rode[0];

    for(int i=1;i<n;i++)

        if(rode[i]<=rode[i-1]) ans[i]=ans[i-1];

        else ans[i]=ans[i-1]+rode[i]-rode[i-1];

    cout<<ans[n-1];

}



P5019 [NOIP2018 提高组]铺设道路的评论 (共 条)

分享到微博请遵守国家法律