はじめに
こんにちは。 Caffeineholic です。
冷房をガンガンに効かせて記事を書いていますが、モチベーションとレートまで冷えてしまわないかが心配なところです。休日は生活サイクルが乱れがちで、朝まで作業して昼に寝て夕方に起きてまた作業する、なんて日が珍しくなくなってきています。昼寝って夏の季語なんですって。変なの。 最近はADTで問題を解いたり、アルゴリズム紹介の記事を読んだりしてはいるのですが、ライブラリをどこまで整えればいいのかがわからず困っています。 (グラフClassなんてのを作ろうとしてたけどどうなんだ…?とか)
ICPCやARCに参加して、考察力、実装力を鍛える必要があるなと再認識したので、知らないアルゴリズムの勉強と平行して重い問題を継続的に解いていきたいですね。
今回もABCにrated参加しましたので、各問題について感想と考察の内容を共有できればと思います。皆解くのが早くて、下の結果サマリに私の名前が載りませんね。
結果サマリ
- ABC467
- WCPC参加人数: 6人
- 各問題の最速解答者(ペナルティなし):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | Nsubaru | 1:21 | Java |
| B | Twil3 | 3:48 | Rust |
| C | ShoboiNamae | 10:54 | C++ |
| D | Twil3 | 62:44 | Rust |
| E | - | - | - |
| F | - | - | - |
| G | - | - | - |
今週の出題
A問題
問題ページ: A問題
問題文を表示
問題文
以下の式で計算される値を と言います。 体重 身長 身長
日本では、 が 以上の人は肥満とされます。 身長 、体重 の人が日本で肥満とされるかどうかを判定してください。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
身長 、体重 の人が日本で肥満とされるならば Yes を、そうでないならば No を 1 行で出力せよ。
if文書くだけだな、とパパっと済ませて提出したら、まさかの2WA!! 小数点誤差を避けるために、判定部分に除算が含まれる場合はなるべく式変形して除算を排除しましょうね。 計算に使われる値について、身長の単位が入力部分そのままの ではなく であるところもケアレスミスポイントです。
B問題
問題ページ: B問題
問題文を表示
問題文
高橋君は 軒の店で買い物をしました。はじめ、高橋君は 円持っていました。
軒目の店では 円の商品を買って 円支払いました。ここで が成り立ちます。そして、 の時、高橋君はお釣りを受け取らず、 の場合、お釣りを受け取りました。
高橋君が全ての店でお釣りを受け取っていた場合に比べて損した金額を求めてください。厳密に述べると、高橋君の最終的な所持金を 円、高橋君が全ての店でお釣りを受け取っていた場合の最終的な所持金を 円とした時、 を求めてください。
制約
- は
keepまたはtake - は全て整数
入力
入力は以下の形式で標準入力から与えられる。
出力
高橋君が全ての店でお釣りを受け取っていた場合に比べて損した金額を出力せよ。
特に多くを語る必要はない問題です。
全ての店でお釣りを受け取っていた場合に比べて損した金額は、受け取らなかったお釣りの合計代金そのままです。
が keep であるときの の総和が答えになりますね。
C問題
問題ページ: C問題
問題文を表示
問題文
※ C 問題の問題文は E 問題と同じです。制約のみが異なります。
以上 以下の整数からなる整数列 、 が与えられます。 の長さはそれぞれ です。
に対して以下の操作を好きな回数行うことができます。
- 以上 以下の整数 を つ選び、 に を加える。
以下の条件を満たすようにするために必要な操作回数の最小値を求めてください。なお、問題の制約下では、必ず条件を満たすようにできることが証明できます。
- について、 を で割った余りは に等しい。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを 1 行で出力せよ。
少し苦労したC問題です。問題文を要約すると、 「 の 番目は の 番目と 番目の要素について、和を取って で割ったあまりを表している」 という状態にするために、ある要素に1加算するという「操作」を何回しなければいけないか求めよ、ということです。前提として、 であることから、各要素に対する「操作」の回数は または です。
最初に考えたことは、貪欲に配列 の要素を書き換えて行くことで最小の操作回数を達成できないかということでした。
-
最初に考えた貪欲解(不正解)
の要素を前から2つずつ見ていき、その2つの和を2で割ったあまりが対応する位置のBの要素と異なれば、見ている要素のうち右側に を足す。 足した数を保存しておき、操作回数として出力する。 また、後ろから2つずつ見ていくという処理でもう一度 ( 見ている要素のうち左側と言い換えて ) 操作回数を求めなおし、良かったほうを出力する。
これでは両端の要素に「操作」を行うのが最適である場合を考慮できていません。また見ている2つの要素のうちどちらを選択するのが最適なのかを毎回考えるようにするは、 かかってしまいます。 ここまでから、 端の値が固定されていた場合 を考えると前から順に処理をしていくことで「操作」をするべき項は一意に定まるということに気づけました。ということは、 の場合と の場合両方について、 の 番目までが決定している前提で の 番目に「操作」するべきか判断するという処理を行えばよいということになります。
D問題
問題ページ: D問題
問題文を表示
問題文
平面上に以下の条件を全て満たす 2 個の円 は存在しますか?ただし は同一である可能性があります。
- 異なる 2 点 は の円周上にある。
- 異なる 2 点 は の円周上にある。
- と は中心が一致する。
個のテストケースが与えられるので、それぞれについて答えを求めてください。
制約
- 入力される値は全て整数
入力
入力は以下の形式で標準入力から与えられる。
各テストケース は以下の形式で与えられる。
出力
行出力せよ。
行目には 番目のテストケースの答えを出力せよ。
各テストケースでは、条件を全て満たす 2 個の円 が存在する場合は Yes を、存在しない場合は No を出力せよ。
D問題です。要約すると、
2つの点 と が円 の周上にある。2つの点 と が円 の周上にある。このとき と の中心が一致するかどうかを判定せよ という問題です。
少し数学の知識が問われるものになっていましたが、手元に以下の図を書けたか否かで大きく解像度が変わったのではないかと思います。
の中心は赤い線、の中心は青い線の上にしかなり得ないので、その直線の方程式を求めて交差しているかを判定すればよいです。
E問題
問題ページ: E問題
問題文を表示
問題文
※ E 問題の問題文は C 問題と同じです。制約のみが異なります。
以上 以下の整数からなる整数列 、 が与えられます。 の長さはそれぞれ です。
に対して以下の操作を好きな回数行うことができます。
- 以上 以下の整数 を つ選び、 に を加える。
以下の条件を満たすようにするために必要な操作回数の最小値を求めてください。なお、問題の制約下では、必ず条件を満たすようにできることが証明できます。
- について、 を で割った余りは に等しい。
制約
-
-
-
-
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを 1 行で出力せよ。
難しかったですね。解説を読んでも実装できる気がしませんでした。
最後に
E問題が難しかったおかげで、時間のかかった4完でもレートは増えています。 A問題のペナルティがなければもっと…といったところでしょうか。Caffeineholicでした。ではまた。