https://abc088.contest.atcoder.jp/tasks/abc088_c
解法 (Hacked)
https://abc088.contest.atcoder.jp/submissions/2108917
この記事は、確定性に欠ける記載があって、Challenge成功済みの記事です。
消してしまうのもアレなので残しておきますが、皆さまからの解説Hackは大歓迎ですので、またよろしくお願いします。
まだ300点問題なので、簡単に考えることを心がけて考えてみる。
すると、a1,a2,a3は全探索可能であると分かる。
これを全探索すると「a1 + b1 = C[0][0]なのでb1 = C[0][0] - a1」のようにb1,b2,b3を一意に定まる。
あとは、これを使って行列Cが正しいかチェックして、整合性が保たれるならYes
1つも条件を満たさないならNo
0≦C[i][j]≦100なので、a1,a2,a3も[0,100]で探索すればいい。
int C[3][3]; int A[3], B[3]; //--------------------------------------------------------------------------------------------------- void _main() { rep(i, 0, 3) rep(j, 0, 3) cin >> C[i][j]; rep(a1, 0, 101) rep(a2, 0, 101) rep(a3, 0, 101) { int b1 = C[0][0] - a1; int b2 = C[0][1] - a1; int b3 = C[0][2] - a1; A[0] = a1; A[1] = a2; A[2] = a3; B[0] = b1; B[1] = b2; B[2] = b3; int ok = 1; rep(i, 0, 3) rep(j, 0, 3) if (A[i] + B[j] != C[i][j]) ok = 0; if (ok) { printf("Yes\n"); return; } } printf("No\n"); }