A - ABD
入力:
出力: なら "ABC"、 なら "ABD" と出力
auto N = readln.chomp.to!int; if(N <= 999) { "ABC".writeln; } else { "ABD".writeln; }
感想: はい
B - Stone Monument
入力:
出力: 積もっている雪の高さ
まず、 という数列を用意する。
int[] arr = new int[](999); arr[0] = 1; foreach(i; 1..999) arr[i] = arr[i-1] + i+1;
そして、 の値 を求めて、 ならば、 を出力すればよいです。
int d = b - a; foreach(i; 0..998) { if(arr[i+1] - arr[i] == d) { writeln(arr[i] - a); } }
感想: ちょっとだけ考察が難しいかもしれないけど、問題文から「隣り合った柱について、雪に埋もれてない部分の長さがそれぞれ与えられる」ので、これらの差をとれば何番目の柱なのかがわかって、同時に積雪量も求められるとわかります。
C - Strange Bank
入力:
出力: この銀行からちょうどN円を引き出すのに必要な操作回数の最小値
僕はDPでときました。漸化式は
という感じで表せます。 具体的に、 に入る の値は
が考えられます。
あとはDPするだけです。
int[] dp; int[] arr = [1, 6, 9, 36, 81, 216, 729, 1296, 6561, 7776, 46656, 59049]; int solve(int i) { if(dp[i] >= 0) return dp[i]; int tmp = int.max; foreach(k; arr) { if(i < k) break; tmp = min(solve(i-k)+1, tmp); } return dp[i] = tmp; } void main() { auto N = readln.chomp.to!int; dp = new int[](N+1); dp[] = -1; dp[0] = 0; solve(N).writeln; }
感想: 入力例3で「これ貪欲法じゃ解けねぇ…!ならばDPしかない!!」となり、DPで解きました。
D - Good Grid
入力:
出力: すべてのマスに対して感じる違和感の和のとりうる最小値
下の文章の添字は問題文と異なります。
素直に全探索を考えます。そうすると、まずはcの(x, y)成分でについて、3色を色から色までで考える必要があるので、それぞれの色をとおき、各マスについて条件を満たしているかどうかを調べ、それぞれについて適切な処理を行おうとすると、計算量がとなり、これは間に合いません。
そこで、まず前処理として色を一つ決め、についてループを回し、先に違和感をそれぞれの場合について計算しておきます。
auto arr = new int[][](3, C); foreach(a; 0..C) foreach(x; 0..N) foreach(y; 0..N) { arr[(x+y)%3][a] += D[c[x][y]-1][a]; }
次に、実際に3色を三重ループで回し、の場合に注意して違和感の最小値を取得します。
foreach(i; 0..C) foreach(j; 0..C) foreach(k; 0..C) { if(i==j||j==k||k==i) continue; res = min(res, arr[0][i]+arr[1][j]+arr[2][k]); }
そして、を出力すればよいです。
感想: コンテスト中は前者の超愚直方式で解こうとしてTLE。終了後にこの方法を知る。まだまだ競プロはわからないことだらけ。
A: Submission #2643843 - AtCoder Beginner Contest 099
B: Submission #2645854 - AtCoder Beginner Contest 099
C: Submission #2649430 - AtCoder Beginner Contest 099
D: Submission #2652709 - AtCoder Beginner Contest 099