Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

B - 豪邸と宅配便

Problem Statement

太郎君は豪邸で一人暮らしをしている．
勉強好きの太郎君は，今日も邸内の書斎で勉強をするつもりである．
太郎君は，書斎以外の場所では集中できないので，勉強は必ず書斎で行う．

ところがこの日，太郎君宛の宅配便が $N$ 件届く．$i$ ($1 \leq i \leq N$) 番目の宅配便の届く時刻は $a_i$ である．
配達員を玄関先で待たせるのは心苦しいので，太郎君は宅配便の届く時刻には玄関にいることにした．
豪邸は広いので，書斎と玄関間の移動には片道 $M$ の時間がかかる．

一方で，太郎君はできるだけ長い時間勉強したいと思っている．
時刻 $0$ から時刻 $T$ までで，太郎君が書斎で勉強できる時間の最大値を求めよ．

なお，太郎君は時刻 $0$ には書斎にいて，時刻 $M$ より早く宅配便が届くことはなく，時刻 $T$ より遅く宅配便が届くこともない．
また，太郎君が宅配便を受け取るのにかかる時間は無視できる．

Input

各データセットは 2 行からなる．
1 行目は空白で区切られた 3 つの整数 $N, M, T$ からなる．
これらの整数は，$1 \leq N \leq 100$, $1 \leq M \leq 10{,}000$, $1 \leq T \leq 10{,}000$ を満たす．
2 行目は空白で区切られた $N$ 個の整数 $a_1, a_2, \dots, a_N$ からなる．
各 $a_i$ は $M \leq a_i \leq T$ を満たし，また $a_i < a_{ i + 1 }$ ($1 \leq i < N$) である．

Output

太郎君が勉強できる時間の最大値を表す整数を 1 行に出力せよ．

Sample Input 1

1 1 5
3

Output for the Sample Input 1

3

Sample Input 2

2 1 10
2 7

Output for the Sample Input 2

6

Sample Input 3

2 4 10
6 8

Output for the Sample Input 3

2

Solution in Scala (judge verdict: Accepted)

object Main extends App {
  import scala.io.StdIn._
  solve
  def solve: Unit = {
    val Array(n, m, t) = readLine.trim.split(' ').map(_.toInt)
    val time: Array[Int] = readLine.trim.split(' ').map(_.toInt)
    var sumDiff = time(0) - m + (if (t - time(n - 1) > m) t - time(n - 1) - m else 0)
    for (i ← 1 until n){
      if (time(i) - time(i - 1) >= 2 * m) sumDiff += time(i) - time(i - 1) - 2 * m
    }
    println(sumDiff)
  }
  implicit class ScopeFunc[T](private val value: T) {
    def let[A](func:T ⇒ A): A = func(value)
    def also(func:T ⇒ Unit): T = {
      func(value)
      value
    }
  }
}