りにゅうしょく

競技プログラミング 日常

Codeforces Round #617 (Div. 3) バチャ

URL:https://codeforces.com/contest/1296
ABCDの4完!4ペナ出してるのが痛すぎるけど、順位表を見る限り他の人も結構ペナを出していた……。

A. Array with Odd Sum

数列から適当にi番目とj番目の数字を選んでA_jA_iに置き換える、という操作を好きな回数できる。適切に操作することで数列の和を奇数にすることが可能か?という問題。
なんか問題文難しくない?操作についてと何を求めるのかを誤読して1ペナ。奇数の個数が奇数か、奇数が1個以上かつ偶数が1個以上ある場合YES、そうでなければNO。

B. Food Buying

x円分の物を購入すると⌊\frac{x}{10}⌋円のキャッシュバックがもらえる。適切に物を買ったとき、払える金額の合計の最大値はいくらか、という問題。
x⌊\frac{x}{10}⌋+x%10に置き換えてシミュレートしていく。このとき⌊\frac{x}{10}⌋だけ別に足し合わせておいて、あとから元のxの値と足せば答えが出る。

C. Yet Another Walking Robot

最初(0, 0)にロボットがいて、L,R,U,Dからなる文字列で上下左右の動きを命令されている。この文字列の部分文字列のうち、切り取っても切り取り前とロボットの座標が変わらない部分のうち最も短いものを切り取るという問題。
zero sum rangesと同じ考え方で、既に出てきた座標に移動した場合、それは切り取っても問題ない動きということになる。一番短いやつを切り取らなきゃいけないので、mapで座標(a, b)が出てきたときの文字列の最新の位置を保持していく。

D. Fight with Monsters

自分が攻撃→ライバルが攻撃を繰り返して、1匹ずつモンスターを倒していく。自分の攻撃力・ライバルの攻撃力・ライバルの攻撃の順番を飛ばすことができる魔法の回数・モンスターたちの体力が与えられるので、自分の手番で最大何匹のモンスターが倒せるかを求める。
まず与えられるモンスターの体力は全部(A+B)で余りを取る。もし余りが0の場合はH_i=A+Bとして、ソートする。自分の手番で一撃で倒せる範囲の体力(1~A)は0回の魔法で倒せる。残り体力がA以上のモンスターについては、体力が少ない順に何回魔法を使えば倒せるかを求める。
体力Hのモンスターを倒すには切り上げの関係で\frac{H+A-1}{A}回攻撃する必要がある。順番として、魔法0回でAダメージ与えることができて、以降は魔法1回ごとに追加でAダメージを与えられるから、魔法を使う回数を求めるときは分子からAを引く。

E1以降は余裕ができたらでいいやの気持ち(そんな日は来ない)
おやすみ~~~~