Ruteのプログラミング日記

競技プログラミング(AtCoder)の問題の解説や、過去問を解いた感想、また解けない過去問について共有したいと思ってます。

東京海上日動 プログラミングコンテスト2020 (A,B問題)解説

こんばんはー。最近レート降下中のRuteです。

今回は、AtCoder Beginner Contest ... ではなく

東京海上日動 プログラミングコンテスト 2020 の 解説をまとめます。

 (といってもA,B問題だけですが)

まず、私に足りないことが今回のコンテストでわかりました。

読解力不足です。(どういうことか知りたい方はこの後のB問題をご覧ください)

 

 

1. A問題「A - Nickname」

問題URL https://atcoder.jp/contests/tokiomarine2020/tasks/tokiomarine2020_a

問題概要:

長さが3以上20以下の文字列Sが与えられます。

Sから適当に連続する3文字を出力しなさい。

解法:

適当に連続する3文字ですから"先頭から3文字"を考えます。Pythonでは Sにおける先頭i文字をS[:i]で取得することが可能です。今回の場合はS[:3]で取得できるので、あとはこれを実装するだけです。

コーディング:

f:id:Rute_programming:20200613215111j:plain

回答コード:https://atcoder.jp/contests/tokiomarine2020/submissions/14218268

2. B問題「Tag」

問題URL https://atcoder.jp/contests/tokiomarine2020/tasks/tokiomarine2020_b

問題概要:

数直線上に、Aに存在する点P,Bに存在する点Qが存在する。

点Pは毎秒Vの距離を移動することが可能。

点Qは毎秒Wの距離を移動することが可能。

点Pと点Qで鬼ごっこをするとき、T秒間に点Pが点Qに追いつくかを判定せよ。ただし、点Pと点Qは最適な移動を常に行う。

解法: 読解力不足が及ぼした結果...

最初、提出したコードはこちらです。

f:id:Rute_programming:20200613215646j:plain

残念ながらこれではWAになりました。なぜWAの判定となるか わかりますか?この後説明します!

 

初めに、問題を整理すると(ここでは鬼役を点P,逃げ役を点Qとしています)

点Pの0秒での座標はA,移動速度はV

点Qの0秒での座標はB,移動速度はW

です。

解法(アルゴリズム的なもの)

  V≦Wのとき、明らかに点Pは点Qに追いつけないので"NO"を出力します。

(V = Wかつ A = Bのときはすでに追いついていますが、制約上このようなケースは考えられないです)

そうでない場合は、

距離 = ABの絶対値、 速度 = VWの絶対値

として以降話を進めていきます。

誤った解釈だとこうなる。

距離を速度で割ったあまりが0でない場合、「相手と同じ座標にいる」というのが不可能なので"NO"と出力する。

あまりが0の場合は、距離を速度で割った商が

T以内なら"YES",

Tより大きいなら"NO"

と出力する。

...という解釈で最初は進めていました。しかし、なぜかWAを連発します。ここで、問題文がよく分からなくなるといういつもの現象に.... (Writerさんごめんなさい

 

冷静に考えると、1秒単位で同じ座標にいるとき以外も考えられそうです。(例えば、「1.5秒で同じ座標にいる」という場合を考えることができます)

ちょっと不安だったのでclarを投げました。

f:id:Rute_programming:20200613220751j:plain

すると、答えが「Yes」として返って来ました。こうなると解釈が変わってきます!

正しい解釈

V≦Wでの条件分岐はそのままで

距離・速度について

0 < 距離/速度 ≦Tならば"YES",

そうでなければ"NO"

を出力する。

これでようやくACを出すことが出来ました!

 コーディング:

f:id:Rute_programming:20200613221138j:plain

回答コード:https://atcoder.jp/contests/tokiomarine2020/submissions/14237193

 

ちなみに読解力不足が招いた代償として4回のWA...(うち1回はコピーミスによるRE)

まぁ読解力不足ということで、次回以降は気をつけます。

 

以上、東京海上日動 プログラミングコンテスト2020のA問題、B問題の解説でした!

明日のABCではRatingを上げられるようにしたいです!