[Swift]AtCoder Beginner Contest 242・A問題[AtCoder過去問・良問]

えっ、これ灰diffなの…!? やだ、私の実装力低すぎ…!?

執筆目的

・著者がABCに出場してもいつもA問題の1完で終わってしまうため、
 せめて2完になるための実力を付ける。
・上記目的を達成する為にB問題の過去問を解く。
・言語:Swift

提出した解答

import Foundation
 
let a = readLine()!.split(separator: " ").map { Int(String($0))! }
let T = (s: a[0], m: a[1], y: a[2]) //s, m, y (秒, m, 休む)
let A = (s: a[3], m: a[4], y: a[5]) //s, m, y (秒, m, 休む)
let time = a[6] //判定time
 
func solve(a: Int, b: Int, c: Int, x: Int) -> Int{
    //一部改変
    var r = x % (a + c)
    return b * (x/(a + c)*a + min(r, a))
}
 
var takahashi = solve(a: T.s, b: T.m, c: T.y, x: time)
var aoki = solve(a: A.s, b: A.m, c: A.y, x: time)
 
if takahashi > aoki {
  print("Takahashi")
} else if takahashi < aoki {
  print("Aoki")
} else {
  print("Draw")
}

解説

・公式解説が何かいてるのかわからなかった…(恐怖)

・入力形式が要素数7、前半3は高橋、後半3は青木、最後の一つが秒数。
 それぞれ変数に代入
・★Solver関数
・高橋と青木のデータをそれぞれSolver関数に代入
・高橋と青木で比較し、勝敗に応じて出力内容を変更する

return b * (x/(a + c)*a + min(r, a))

(秒あたり)進む距離 * (時間/(秒 + 休む時間) + (r,aの小さいほう))
r … x を a+cした余り

・[歩く時間  (A)  ]→[休む時間  (C)  ]を1周期とする。
・[全体の時間 (X)]を1周期で割ると、余りを求めることが出来ます。
・この余りが(発生した場合は)、最後の周期においてどの地点で立っていたのかを表すことができます。
・つまり、左辺の x/(a+c)*aは、x/(a+c)周期の中で進んだ距離を求め、右辺ではx%(a+c)すなわち最後の周期でどれくらい進んだかを求めています。x%(a+c)がbの中にいる場合をはじく必要があるため、minでrとaを比較しないといけないという認識です。(あってるかな?)


この問題、2003年生まれの灘校生(赤コーダー)が書いているらしく、おじさんは戦々恐々としています。すごい。

この記事が気に入ったらサポートをしてみませんか?