Problem:
Score : 300 points

Problem Statement

In a flower bed, there are N flowers, numbered 1,2,......,N. Initially, the heights of all flowers are 0.
You are given a sequence h=\{h_1,h_2,h_3,......\} as input. You would like to change the height of Flower k to h_k for all k (1 \leq k \leq N), by repeating the following "watering" operation:

Specify integers l and r. Increase the height of Flower x by 1 for all x such that l \leq x \leq r.

Find the minimum number of watering operations required to satisfy the condition.

Constraints

1 \leq N \leq 100

0 \leq h_i \leq 100

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
h_1 h_2 h_3 ...... h_N

Output

Print the minimum number of watering operations required to satisfy the condition.

Sample Input 1

4
1 2 2 1

Sample Output 1

2

The minimum number of watering operations required is 2.
One way to achieve it is:

Perform the operation with (l,r)=(1,3).

Perform the operation with (l,r)=(2,4).

Sample Input 2

5
3 1 2 3 1

Sample Output 2

5

Sample Input 3

8
4 23 75 0 23 96 50 100

Sample Output 3

221

Solution in Rust (1.15.1) (judge verdict: Accepted)



fn main() {
    let n: usize = read();
    let h: Vec<i32> = read_to_vec(n);

    let mut f = vec![0; n];

    let mut rtn = 0;

    while !finished(&h, &f) {//与えられた配列と一致するまでループ
        let mut bef = false;
        for i in 0..n {
            if bef != (h[i] > f[i]) && h[i] > f[i] {
                rtn += 1;
            }
            if h[i] > f[i] {
                f[i] += 1;
                bef = true;
            } else {
                bef = false;
            }
        }
    }
    println!("{}", rtn);
}


// 以下使い捨て関数

fn finished(h: &[i32], f: &[i32]) -> bool {
    for i in 0..h.len() {
        if h[i] != f[i] {
            return false
        } else {
            continue;
        }
    }
    true
}

// 以下作り置き関数
use std::io::*;
use std::str::FromStr;

pub const MOD: i64 = 1_000_000_007;


/// 標準入力から
/// 空白文字で囲まれた1つのトークンを
/// 指定の型に変換する
pub fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char)
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

/// 標準入力から
/// 空白文字で囲まれたn個のトークンを
/// 指定の型に変換し
/// Vecに格納する
pub fn read_to_vec<T: FromStr>(n: usize) -> Vec<T> {
    let mut v = Vec::with_capacity(n);
    for _i in 0..n {
        v.push(read());
    }
    v
}

/// 標準入力から
/// 空白文字で囲まれたm個のトークンを
/// 指定の型に変換したVecを
/// Vecにn個格納する
pub fn read_to_vec_in_vec<T: FromStr + Clone>(n: usize, m: usize) -> Vec<Vec<T>> {
    let mut v: Vec<Vec<T>> = vec![Vec::with_capacity(m); n];
    for i in 0..n {
        v[i] = read_to_vec(m);
    }
    v
}