タイトル説明
クリスは、長さの敷設を担当する道路エンジニア、です\(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;
}