問題への解決策[羅区P5019] [NOIP2018]舗装道路

タイトル説明

クリスは、長さの敷設を担当する道路エンジニア、です\(N \)道路上。

メイン舗装道路表面の沈下が充填されています。道路のセクション全体は以下のように考えることができる\(N- \)初めに、ブロックの端に接続された領域の端\(I \)領域に押下深さブロック(D_I \)\を

クリスは、連続区間のための日を選択することができる\([L、R&LT] \) この区間の各充填領域、ダレ低減する許可深\(1 \)をそれを確実にするために必要なときに選択インターバルは、各領域内に充填する前に、サグ深さ間隔がされていない(0 \)\します

クリス・ホープは、あなたは彼が最短時間で沈没道路の全体の深さは、となっていることができソリューション設計に役立つことができます\(0 \)

入出力フォーマット

入力形式

入力ファイルは、2つの行が含まれ、最初の行は、整数含ま\(N-を\) 道路の長さを表します。二行目に含まれる\(\ N-)隣接する二つの数字の間のスペースで区切られた整数を、\(Iは\)整数番目の\(D_I \)

出力フォーマット

出力ファイルには、タスクを完了するための最小日数を必要とする唯一の整数を、含まれています。

サンプル入力と出力

入力サンプル#1

6   
4 3 2 5 3 5 

サンプル出力#1

9

説明

サンプルの解釈

一つの可能な解決策を選択し、最良である:\([1,6] \)、\ ([1,6] \)、\ ([1,2] \)、\ ([1,1] \ )、\ ([4,6] \)、\ ([4,4] \)、\ ([4,4] \)、\ ([6,6] \)、\ ([6,6] \ )

データサイズと大会

以下のための\(30 \%\)データ、\(1≤N-≤10 \。) ;
のための\(70 \%の\)データ、\(1≤N-≤\ 1000) ;
のための\(100 \%の\)データ、\(1≤≤N-100000、10000≤0≤D_I \)

問題の解決策

この質問は私達の範囲「穴を埋める」操作のためです。

したがって、私たちの戦略は貪欲です:

それぞれのための\(I \)(\ (2 \のLeq I \ N-LE \) する\(ANS \)プラス\([I] - [I - 1] \)

それを証明するには?

そこ仮定(2 \)\それがで記入されますピットイン、ピットは、あなたは確かに、同時に2つの小さなピットのピット深さを記入します(\ [I] - [I - 1] \ の深さ。

したがって、この貪欲は正しいです。

この貪欲戦略によれば、コードを書くことは難しいことではありません。

コード

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>

using namespace std;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
    return f * x;
}

int n, a[100003], ans;

int main()
{
    n = gi();//输入道路的长度
    for (int i = 1; i <= n; i++)
    {
        a[i] = gi();//输入坑的深度
        if (a[i] > a[i - 1])ans = ans + a[i] - a[i - 1];//如果当前深度比上一个坑的深度大,就进行贪心,累计答案
    }
    printf("%d", ans);//最后输出答案即可
    return 0;
}

おすすめ

転載: www.cnblogs.com/xsl19/p/11104974.html