h3mky0's blog

主に競プロについて書きます

CADDi for Beginners 反省

12/22にあったCADDibに参加した

atcoder.jp

 

A. 12/22

4桁の数字が与えられるので, そこに含まれる"2"の個数を求める

count関数を使ってあげると短く書ける

https://atcoder.jp/contests/caddi2018b/submissions/3837292

 

 B. AtCoder Alloy

ある縦H, 横Wを満たすような合金の板となるようにカットできるか?という問題

本来なら回転も考慮する必要があるが, そのような問題設定はないので

与えられた板がH以上かつW以上を数えればよい

https://atcoder.jp/contests/caddi2018b/submissions/3837919

 

C. Product and GCD

あるN個の数字a_1 , a_2, ..., a_Nの積がPとなるとき, a_1 , a_2, ..., a_Nの最大公約数のうちもっとも大きい値を出力する.

 

ここである最大公約数をdとしておく

・考えたこと

1. a_1 , a_2, ..., a_Nは共通の最大公約数dを持つ

2. 1よりP≧d^Nが成り立つ

3. P素因数分解したとき, ある素数pN個以上あれば, dのうちの一つとなる

4. 素因数分解O(sqrt(P))で行える

 

以上の考え方ではN=1がコーナーケースになるので注意する

ここで1WAしてしまった.

https://atcoder.jp/contests/caddi2018b/submissions/3841076

 

D. Harlequin

問題文: 

https://atcoder.jp/contests/caddi2018b/tasks/caddi2018_b

プレイヤーが二人いて, あるゲームを行う.

N本のリンゴの木が与えられ, 各木ににはa_i個のリンゴがなっている. プレイヤーはリンゴを一個だけ取るという操作を各木に対して行うか行わないかを選択できる. 最後のリンゴを取ったプレイヤーが勝利となる.

与えれた入力に対しどちらのプレイヤーが勝利するかを出力する.

 (firstが先手, secondが後手とする)

 

・考えたこと

1. N=1のとき, a_1が奇数ならfirstが勝つ, 一方で偶数ならsecondが勝つ

2. sample2を見るとすべての木が偶数ならsecondが勝っている

3. 上記の二つの条件から「a_1, a_2, ... , a_Nがすべて偶数ならsecondが勝つ」と仮定する

4. 上の仮定を保障してくれそうな事実を考える

a_1, a_2, ... , a_Nがすべて偶数のとき, firstが奇数個にしたリンゴと同じ木からリンゴを取ることで, secondのターン終了時に「a_1, a_2, ... , a_Nがすべて偶数」という状況を維持できる

 

逆に, 初期の状態から奇数本の木が含まれていると, firstのターン終了時に奇数個の木を残すことができる. firstは奇数個のリンゴの木を1本でも残すことができれば勝てるため,

このゲームの勝利判定基準として, 「a_1, a_2, ... , a_Nがすべて偶数か」を考慮すればよい.

(一部誤っているかもしれません, 申し訳ないです)

https://atcoder.jp/contests/caddi2018b/submissions/3843125

 

・全体の結果

rank: 25th

performance: 1600

今回の問題セットは得意だったので, 逆にアルゴリズム使って実装する系が苦手なんだなーとなってしまった.

賞金ほしかったですね