2017-12-01から1ヶ月間の記事一覧

ARC046 B - 石取り大作戦

解法 N <= Aの時 絶対に先行が勝つ N > Aの時 A > Bの時 N > A > Bであるため先攻が1個だけとる戦法をとると絶対にN > Bにできる。N <= Aになったら全部取れば良い。よって先攻が勝つ。 A < Bの時 N > B > Aである。A > Bの時と同様に考えると、後攻が絶対勝…

ARC051 C - 掛け算

解法 愚直にシミュレーションするとB≦109なのでTLEしてしまう。 操作を十分な回数行うと、一番小さい数にAをかけると一番大きな数になる状態ができる。 この状態になれば周期性を利用してとくことができる。 この状態になった時の数列が{a'}で残りの操作回数…

SRM609 div2 Med PackingBallsDiv2

解法 variety setを何個売るか決まれば、同じ色のパッケージを何個売らないといけないか決まる。 variety setを何個売るかで全探索。 コード class PackingBallsDiv2 { public: int minPacks(int R, int G, int B) { int ans = 1e9; // variety set for(int …

ARC071 E - TrBBnsformBBtion

解法 どんな文字列でも"A"or"B"or""の3種類のどれかにすることができる。そのため無限にある文字列を"A"にできる文字列、"B"にできる文字列、""にできる文字列の3つのグループに分けることができる。"A"にできる文字列は逆に"A"から作ることができる。"B"、"…

CODE THANKS FESTIVAL 2017(Parallel)

A - Time Penalty 最大値出力。 #include <algorithm> #include <cstdio> #include <iostream> #include <map> #include <cmath> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <vector> #include <stdlib.h> #include <stdio.h> #include <bitset> #include <cstring> #incl…</cstring></bitset></stdio.h></stdlib.h></vector></string></stack></sstream></set></queue></cmath></map></iostream></cstdio></algorithm>

ARC070 D - No Need

解説 wa = a_iを含む良い集合の和の最小値とすると、 wa - a_i ≧ K <=> a_i は不必要 wa - a_i < K <=> a_i は必要 となる。 全てのカードiについて、カードiを含まないカードで作れる和をdpで調べる。 dp[j][k] = カードjまで調べたときに和kを作れるかどう…

KUPC2017 C - Best Password

解説 できるだけ一文字目の方に大きい文字(z,y,x,...,a)を作っていく。繰り上げしていくイメージ。 Ai C[S_i] + Ai+1 C[S_(i+1)] => Ai (C[S_i] + A) + Ai+1 * (C[S_(i+1)] - 1)。 N文字目から繰り上げできるだけしていく。 コード #include <algorithm> #include <cstdio> #inc</cstdio></algorithm>…

天下一プログラマーコンテスト2016予選A C - 山田山本問題

解説 a,...,zを頂点としてトポロジカルソート。 頂点数が少ないので、O(N3)のアルゴリズムでOK。 トポロジカルソートの参考サイト。 Topological sort コード #include <algorithm> #include <cstdio> #include <iostream> #include <map> #include <cmath> #include <queue> #include <set> #include <sstream> #include <stack> #</stack></sstream></set></queue></cmath></map></iostream></cstdio></algorithm>…

ARC067 E - Grouping

解説 dp[i][j] = i人未満のグループのみで、j人を分ける通り数とする。 このようにdpを定義すると、dpの更新式は以下のようになる。 i人のグループを一個も作らないとき、 残りのN-j人のうち、i人のグループをk個作るとき、 で割るのはグループを区別しない…