SRM 481 div1 easy: ChickenOracle
解法
落ち着いて状況を整理すると, 以下のような表になります。
表の i を決定すれば, j, k, l は決定されるので, i を全探索しましょう。
真実が egg の時は k+i が eggCount になり, 真実が chicken のときは j+l が eggCount になります。
class ChickenOracle { public: string theTruth(int n, int eggCount, int lieCount, int liarCount) { int type = 0; for (int i = 0; i <= min(lieCount, liarCount); i++) { int j = liarCount-i; int k = n-lieCount-j; int l = lieCount-i; if (j < 0 || k < 0 || l < 0) continue; // egg is truth int ec = i+k; if (ec == eggCount) type |= 1; // chicken is truth ec = j+l; if (ec == eggCount) type |= 2; } if (type == 0) return "The oracle is a lie"; if (type == 1) return "The egg"; if (type == 2) return "The chicken"; if (type == 3) return "Ambiguous"; } };