渡り鳥の旅路

元半導体系エンジニア、今Webエンジニアの雑記

AtCoder ABC 151 B - Achieve the Goal (200 点)

はじめてABCに参加

問題へのリンク

問題概要

N科目のテスト(各K点満点で点数は0点以上の整数)に対して、N-1科目までの点数が出ている時(i番目の点数はA_i)、平均点をM点以上にするために最後のテストで最低点取る必要があるかを求める。

達成できない場合は'-1'を出力する。

制約

  • 2<=N<=100
  • 1<=K<=100
  • 1<=M<=K
  • 0<=A_i<=K
  • 与えられる値は全て整数

解法

必要な最低点を求める簡単な方程式を時、それを実装した。テストコードで0点をとっても良いケースの考慮が必要だとわかり条件を微調整。

本番で書いたコード

n, k, m = gets.split.map(&:to_i)
scores = gets.split.map(&:to_i)
sum = scores.inject(:+)
 
required_score = n*m - sum  # 必要な最低点を求める式
 
if required_score > k
  puts -1
elsif required_score < 0
  puts 0
else
  puts required_score
end

N-1科目までの合計を求める時にArray#sumなんで使えない!?となってたら、AtCoderはRuby2.3.3だった。。

よってEnumerable#injectを使用。下記記事のコメントにあるように初期値を与えた方が安全。

qiita.com