Problem:
G: 労働 (Working)

コウさんはこれから $N$ 日間、毎日同じ件数の仕事をすることにした。

$N$ 日間のうち $i$ 日目には仕事が $A_i$ 件追加される。

コウさんには今溜まっている仕事はなく、$N$ 日目までにすべての仕事が終わっている必要はない。

一日で最大何件の仕事ができるか。

ただしコウさんは優秀なので、仕事が存在する限り何件でも仕事をすることができる。

入力

1 行目には $N$が与えられる。

2 行目には $N$ 個の整数 $A_1, A_2, A_3, \dots, A_N$ が空白区切りで与えられる。

出力

一日にできる仕事の最大の件数を出力せよ。最後には改行を入れること。

制約

$N$ は $1$ 以上 $100$ 以下の整数

$A_1, A_2, A_3, \dots, A_N$ は $1$ 以上 $100$ 以下の整数

入力例1

5
4 2 5 3 1

出力例1

3

一日 $4$ 件以上仕事することにすると、2 日目に仕事が尽きてしまいます。

入力例2

5
9 9 1 9 9

出力例2

6

Solution in Scala (judge verdict: Accepted)

object Main extends App {
  import scala.io.StdIn._

  val n = readInt
  implicit val task = readLine.trim.split(' ').map(_.toInt).toList
  println(
    lowerBound(0, 100)(canMake) - 1
  )
  def canMake(norma: Int)(implicit task: List[Int]): Boolean = {
    def sub(restTask: List[Int], stocked: Int = 0): Boolean = {
      restTask match {
        case Nil ⇒ true
        case h::t if stocked + h >= norma ⇒ sub(t, stocked + h - norma)
        case _ ⇒ false
      }
    }
    sub(task)
  }
  def lowerBound(from: Int, until: Int)(func: Int => Boolean) : Int = {
    var left = from
    var right = until
    while(left < right){
      val mid = (left + right) / 2
      if (func(mid)){
        left = mid + 1
      }else {
        right = mid
      }
    }
    right
  }
  implicit class Scope[T](val value: T) extends AnyVal {
    @inline
    def let[A](func: T ⇒ A): A = func(value)
  }
}