スポンサーリンク

【Python】AtCoder Beginner Contest 005 A,C問題 解答

スポンサーリンク
スポンサーリンク
この記事は約3分で読めます。

 

A問題

1つのたこ焼きを作るためにはxグラム必要であり、現在yグラム持ち合わせているので、yをxで割り算することでたこ焼きを何個作ることができるかがわかります。

ただし、問題文の入力例を見ると割り算の結果が1未満の場合、作ることができるたこ焼きは0個となっています。

たこ焼きは1,2,3個と整数で数えるもので、1.5個というのもよくわからないですしね。(生地だけのたこ焼きとか、半分くらいの大きさとかあるかもしれませんが。)

1行目でmathをインポートし、math.floor(n)としたことで小数点以下を切り捨て捨てることができました。

 

 C問題

方針

以下の条件を満たせば問題ないと理解しました。

1.全てのお客さんにたこ焼きを売ることができる

2.それぞれのたこ焼きは作られてからT秒以内に売らなければならない

3.それぞれのお客さんが来た時にはたこ焼きが作られていなければならない

 

1の条件より、たこ焼きよりもお客さんの数が多い時点でnoを出力しています。全員に売れない時点で作成後 T秒以内のたこ焼きがあるかについて計算するのは無駄だと考えました。

2の条件より、「お客さんが来た時間 ー たこ焼きが作られた時間」がT秒以内なら良さそうです。

3の条件より、入力例4にあるようにお客さんが来た時点でたこ焼きがない場合はnoと出力しなければなりません。これは「お客さんが来た時間 ー たこ焼きが作られた時間」が0秒以上という式で表現しました。

以上の条件式をまとめるとこのようになります。

0 <=「お客さんが来た時間 ー たこ焼きが作られた時間」<=T

あとは、それぞれのお客さんに対してこの条件を満たすたこ焼きがあるかをforループで判断していきます。

flagは0の時は条件を満たすたこ焼きがあり、1の時は条件を満たすたこ焼きがないことを表しています。

 

解答

 

[1]お客さんの数だけ繰り返しています。

[2]たこ焼きの数だけ繰り返しています。繰り返しの回数をlen(a)ではなくnとした場合、後のremoveでリストaの要素数が減っているのに、内側ループの次回実行時に元のたこ焼きの数(n)回繰り返すことになります。リストの要素数よりも大きい範囲を指定することによるエラーが発生します。

[3]作成後T秒以内で、お客さんが来た時にたこ焼きが作られていれば、そのたこ焼きをリストから除外し、flagに0をセットして内側のループを次の周回に進ませています。

[4]条件を満たすたこ焼きでなければflagに1をセット

[5]内側のforループが終了した時に、flagが1のままであればnoを出力し、その時点で終了しています。

コメント