はじめに
こんにちは。 Caffeineholic です。 およそ二週間前の記事を書いていますが、私の図太さは他の人のそれとは段違いですので、記事の日付を調整することでごまかそうと思います。 小学校時代の必殺技、「したけど忘れました」が思い出されます。この記事に原稿料が出れば喜んで毎週書くのですが、まあ文章の練習になっているのでよしとしましょう。
グリッドやグラフといった(比較的)得意な分野が出題されたからか、5問解くことができましたので今回も考察と所感を書いていきますよ。
結果サマリ
-
WCPC参加人数: 7人
-
各問題の最速解答者(ペナルティ無し):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | nsubaru | 0:45 | Java |
| B | Caffeineholic | 3:10 | Python |
| C | nsubaru | 9:33 | Java |
| D | nsubaru | 23:08 | Java |
| E | Caffeineholic | 74:51 | Python |
| F | - | - | - |
| G | - | - | - |
今週の出題
ABC472-A
問題ページ: A問題
問題文を表示
問題文
英大文字からなる文字列 が与えられます。
のうち A 以外の文字をすべて . に置き換えた文字列を出力してください。
制約
- は英大文字からなる長さ 以上 以下の文字列
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
for文と配列を理解していれば解ける問題かと思います。A問題でこんなにfor文が要りそうな問題は少し珍しいかも…?
ABC472-B
問題ページ: B問題
問題文を表示
問題文
棒が 本あります。この棒には切れ込みが 箇所入っており、切れ込みによって 個の部分に分かれています。 それぞれの部分の長さは端から順に です。 切れ込みを 箇所選び、そこで棒を折って 本の棒にするとき、折ってできる 本の棒の長さの差の絶対値の最小値を求めてください。 ただし切れ込みの幅は無視でき、折ってできる 本の棒の長さはそれぞれの棒に含まれる部分の長さの総和になります。
制約
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
左の切れ込みから順に、実際に折った場合の値を求め最小値を保存していきます。
ABC472-C
問題ページ: C問題
問題文を表示
問題文
高橋君は 日間の帰省で実家に滞在しています。 実家では毎日おやつが用意されており、 日目のおやつのカロリーは です。 高橋君は体調管理のために、直近 日間で食べたおやつのカロリーの合計が を超えないならばおやつを食べることを繰り返します。 具体的には の順に、以下のルールに従って 日目のおやつを食べるかどうかを決定します。
- 日目のおやつを食べたと仮定したときに 日目から 日目までの間に食べたおやつのカロリーの合計が 以下ならば、 日目のおやつを実際に食べる。そうでないならば、 日目のおやつを食べない。
それぞれについて、高橋君が 日目のおやつを食べるかどうかを判定してください。
制約
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
行出力せよ。
行目には高橋君が 日目のおやつを食べる場合 Yes と、食べない場合 No と出力せよ。
問題文通りにシミュレーションすることで解ける問題でした。 「 番目のおやつを食べたかどうか」を管理する必要がありますが、特定のアルゴリズムが必要とされる問題ではありませんでした。
ABC472-D
問題ページ: D問題
問題文を表示
問題文
行 列のグリッドがあります。各マスは、空マスまたは爆弾マスのどちらかです。上から 行目、左から 列目のマスを と表します。グリッドの情報は 個の長さ の文字列 によって与えられ、 の 文字目が . のとき は空マス、 の 文字目が # のとき は爆弾マスです。
また、空マス について 行目にも 列目にも爆弾マスが存在しないとき、そのマスを 安全な空マス と呼びます。
回の移動で今いるマスから、上下左右に隣り合う空マスに移動することができます(爆弾マスには移動できません)。以下の条件を満たす空マス の数を求めてください。
- から 回以下の移動で 安全な空マス へ到達できる。
制約
- は
.と#からなる長さ の文字列 - は整数
入力
入力は以下の形式で標準入力から与えられる。
出力
条件を満たす空マスの個数を出力せよ。
安全な空マス、安全でない空マス、爆弾マスの3種類のマスがあることを踏まえて、問題は、「K回以下で安全な空マスに到達できるマス」を数えるものです。 これは、「安全な空マスからK回以内に到達できるマス」を数える問題と捉え直すと、コーディングの見通しが良くなります。 全ての安全な空マスを視点として幅優先探索を行い、各マスに最初に到達した時にステップ数を書き込みます。すでに探索したマスに書かれている数字が最善な数字であることから再度訪れないようにでき、そうすることで計算量を に抑えられることが保証できます。
ABC472-E
問題ページ: E問題
問題文を表示
問題文
頂点に から の番号がついた 頂点 辺の単純連結無向グラフが与えられます。 番目の辺は頂点 と頂点 を結んでいます。 奇数個の頂点からなる閉路が存在するか判定し、存在するならば つ求めてください。 厳密には、次の条件を全て満たす整数列 が存在するか判定し、存在するなら つ求めてください。
- は 以上の奇数である
- はすべて異なる
- を満たす全ての整数 について、頂点 と頂点 の間に辺がある。ただし とする
個のテストケースが与えられるので、それぞれについて答えを求めてください。
制約
- 全てのテストケースにおける の総和は 以下
- 全てのテストケースにおける の総和は 以下
- 与えられるグラフは単純連結無向グラフである
- 入力される値はすべて整数である
入力
入力は以下の形式で標準入力から与えられる。
各テストケースは以下の形式で与えられる。
出力
各テストケースについて、条件を満たす数列が存在しない場合は -1 を出力せよ。存在する場合は以下の形式で つ出力せよ。
条件を満たす数列が複数存在する場合、どれを出力しても正解となる。
グラフ内の奇数長のサイクルを探す問題でした。 私の解答では、始点を適当に決めて幅優先探索でグラフのノードに番号を書き込んでいきました。数字の偶奇が同じになるノード同士が結ばれることがあれば、そこに奇数長のサイクルができているといえます。 始点を一つ横のノードにずらすと他のノードに書かれた数字(探索の深さ)も同じだけずれることから、始点を適当に決めてもよいのではないかと考えていました。 サイクルの判定はすぐに書けたものの、検出したサイクルを復元するために大幅に書き直しをする羽目になり時間を取られていました。無事解答できてよかったです。
F問題以降は割愛させていただきます。
最後に
Caffeineholicでした。それではまた。