mayoko’s diary

プロコンとかいろいろ。

SRM 481 div1 easy: ChickenOracle

解法

落ち着いて状況を整理すると, 以下のような表になります。
f:id:mayokoex:20160130115545j:plain
表の 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";
    }
};