Problem:
Score : 300 points

Problem Statement

There is an integer sequence A of length N whose values are unknown.

Given is an integer sequence B of length N-1 which is known to satisfy the following:

B_i \geq \max(A_i, A_{i+1})

Find the maximum possible sum of the elements of A.

Constraints

All values in input are integers.

2 \leq N \leq 100

0 \leq B_i \leq 10^5

Input

Input is given from Standard Input in the following format:

N
B_1 B_2 ... B_{N-1}

Output

Print the maximum possible sum of the elements of A.

Sample Input 1

3
2 5

Sample Output 1

9

A can be, for example, ( 2 , 1 , 5 ), ( -1 , -2 , -3 ), or ( 2 , 2 , 5 ). Among those candidates, A = ( 2 , 2 , 5 ) has the maximum possible sum.

Sample Input 2

2
3

Sample Output 2

6

Sample Input 3

6
0 153 10 10 23

Sample Output 3

53

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

use std::io::stdin;
use std::iter::Iterator;
use std::collections::VecDeque;
use std::collections::HashMap;

fn solve(cin: &mut ConsoleInputWrapper) {
    let n: usize = cin.input().parse().unwrap();

    let mut b: Vec<i32> = Vec::new();

    for i in 0..n - 1 {
        b.push(cin.input().parse().unwrap());
    }

    let mut i = n - 2;
    let mut sum = b[n - 2] + b[0];
    while i > 0 {
        sum += [b[i - 1], b[i]].iter().min().unwrap().clone();
        i -= 1;
    }
    println!("{}", sum);
    ()
}

//Other Functions Here

fn main() {
    let mut cin = ConsoleInputWrapper::new();
    solve(&mut cin);
}

fn factorization(value: i64) -> HashMap<i64, usize> {
    let sqrt = f64::sqrt(value.clone() as f64);
    let mut value = value;
    let mut map = HashMap::new();
    let mut p = 2;
    while p.clone() as f64 <= sqrt {
        let mut count = 0;
        while (value % p.clone()) == 0 {
            count += 1;
            value /= p.clone();
        }
        if count > 0 {
            map.insert(p.clone(), count);
        }
        p += 1;
    }
    if value != 1 {
        map.insert(value, 1);
    }
    map
}

fn gcd(a: i64, b: i64) -> i64 {
    if b == 0 {
        a
    } else {
        gcd(b.clone(), a % b)
    }
}

fn min(a: i32, b: i32) -> i32 {
    if a < b { a } else { b }
}

fn max(a: i32, b: i32) -> i32 {
    if a > b { a } else { b }
}

struct ConsoleInputWrapper {
    queue: VecDeque<String>
}

impl ConsoleInputWrapper {
    fn new() -> ConsoleInputWrapper {
        ConsoleInputWrapper {
            queue: VecDeque::new()
        }
    }
    fn input(&mut self) -> String {
        if self.queue.len() <= 0 {
            let mut s = String::new();
            stdin().read_line(&mut s).unwrap();
            let list: Vec<&str> = s.split_whitespace().collect();
            for string in list {
                self.queue.push_back(String::from(string));
            }
        }
        self.queue.pop_front().unwrap()
    }
}