0.はじめに
緑コーダに戻って初めてのコンテスト。
久々にD問題まですらっと解けましたが
E以降は無理でした。
D問題までは配点的にも易しい問題だったので
レートは+5と微増で783となりました。
1.A - Welcome to AtCoder Land
特にひねることもなくインプットを指定文字と比較して
結果を出力して終了
https://atcoder.jp/contests/abc358/submissions/54556739
2.B - Ticket Counter
B問題らしい難易度の問題(あくまで個人の感想です)
前の客が購入が終わった時間を変数pre(最初は0)に保持。
i番目の客が購入が終わる時間は
preとT[i]の大きい方+A
それを表示してpreに格納して次の人をチェック
と、繰り返して終了
https://atcoder.jp/contests/abc358/submissions/54564292
3.C - Popcorn
制限がゆるいので、素直に全部試してもいけるかもと思い
まずは実装
【実装】
・配列LにSを格納
・itertools.permutationsを全順序の組み合わせに対して
全種類のポップコーンが何店舗目で変えるかをチェック
・一番少ない店数で買える組み合わせを表示
→例題は問題なくクリア
→10種類のポップコーンが10個の店でそれぞれ一個ずつ売られている
一番時間のかかりそうなパターンを試す
→4秒とテスト自体は終了するけど、問題の制限はオーバー
と、微妙な感じだったので順序の組み合わせに対するチェック部分を
bit演算に変更することによって300ms以下に実行時間を減らすことができました。
https://atcoder.jp/contests/abc358/submissions/54586627
4.D - Souvenirs
C問題よりも簡単な気がしました。
”1 人に 2 個以上の箱を渡すことや同じ箱を複数人に渡すことはできないことに注意してください。”
という注意書きから、考えがだいぶ簡単になるなと思いました。
【考え方】
・AとBを昇順に並べる。
・A用のINDEX”j”と回答用変数ansを0で初期化
・Bを先頭から見ていき(INDEX i)
jをB[i]>A[j](人B[i]が満足するお土産)まで
jに1を加算していく
この際、jがNを超えたら-1を出力して終了
・超える前にB[i]<=A[j]を満たすjが見つかったら
ansにA[j]を加算し、jに1加算(同じお土産を違う人に渡せない為)
→この際、jがNを超えかつ、iがM未満(まだお土産渡していない人がいる)の時
-1を出力して終了
・Bを無事見終わったらansを出力して終了
マッチング的な考え方で解決できました。
https://atcoder.jp/contests/abc358/submissions/54591192
以上