seriruの技術屋ブログ

競技プログラミングやゲーム開発など技術に関することを発信します

AtCoder Beginner Contest 112

AtCoder Beginner Contest 112に参加しました。自分なりの考察と解答をまとめます。

A Programming Education

問題

1か2の入力を受け取り、1ならば 'Hello World'を、2ならば 2つの入力を受け取りその和を出力せよ。

最初に整数の入力を受け取り、それによって処理を分岐させれば良いです。

sample code:

Submission #3341589 - AtCoder Beginner Contest 112

B Time Limit Exceeded

問題

 T より小さいコスト Cの中で一番小さいものを出力せよ。

最初にpair<int, int>型のvectorを用意して入力を受け取ります。

その後受け取った入力に対して、 T を超えない最小の  c_i を出力すれば良いです。

sample code:

Submission #3343694 - AtCoder Beginner Contest 112

C Pyramid

問題

中心座標が (  C_1, C_2 ) で高さが  H のピラミッドがある。座標 (  X, Y ) の高度が  max(H - |X - C_X| - |Y - C_Y|, 0) で与えられるとき、N個の座標の情報と以下の条件から中心座標と高さを求めよ。

条件

  •  C_X, C_Y は0以上100以下で,  H は1以上の整数。

  • N個の情報の  i 番目は, 「座標 (  x_i, y_i ) の高度は  h_i である」

考察

今回の鬼門のC問題です (4WA)

いろいろ条件がありますが、一旦それらを無視して中心座標と高さの求め方を考えてみましょう。

条件より、 C_X, C_Y は0以上100以下、なので  C_X, C_Y の組み合わせはたかだか104通りです。

さらに、座標 (  X, Y ) の高度は  max(H - |X - C_X| - |Y - C_Y|, 0)で与えられるので、

 H - |x_i - C_X| - |y_i - C_Y| = h_i より、

 H = h_i + |x_i - C_X| + |y_i - C_Y|

となります(  H - |X - C_X| - |Y - C_Y| &lt; 0 でないとします)。

よって、2重ループで中心座標候補を決め、その候補に対して  H を求めて、それがN個の情報と一致するか調べればよいです。

ただ、このまま提出するとWAです。

気を付けなければならないのは、 H > 0 max(H - |X - C_X| - |Y - C_Y|, 0) の条件です。つまり、

  • 中心座標候補から求めた  H が1未満だったら弾く。

  •  H - |X - C_i| - |Y - C_i| &lt; 0 のときは,  h_i = 0

という操作を行う必要があります。

これらすべてをかいくぐることでやっとACがもらえます。

sample code:

Submission #3353690 - AtCoder Beginner Contest 112

D Partition

問題

整数 N,M が与えられる。

 a_1 + a_2 + ... + a_N = M となる正整数からなる長さ N の数列  a のおいて,  a_1 , a_2 , ... ,a_N の最大公約数の最大値を求めよ。

考察

がちがち(?)の数学問です。

最初に取り得るGCD(最大公約数)の最大値を考えてみます。

整数 nのGCDは明らかに  n 以下なので、数列で最小の整数の約数になります。

よって、すべての数列の要素が M / Nであれば最大であるとわかります。

さらに、数列の公約数が Gのとき、 G * a' = G * M' となるはずなので、 M G を約数に持ちます。

後は、数列のGCDの最大値が  M / N だと分かっているのでそこまでで一番大きい  M の約数を出力すれば良いです。

sample code :

Submission #3353047 - AtCoder Beginner Contest 112

このコードでは、109 / 2なら全探索で回るだろーと思って約数を求める手順を省いちゃってます。


Cが普通に難しかった...