2011-06-30 18:08:47Morris

c093. Counterfeit Dollar

c093. Counterfeit Dollar

內容 :

Sally 有一打銀幣(十二個),可是只有11個是真的,有一個是假的(但是它的顏色和大小都和真的一樣)。還好那個假幣的重量和真的不一樣,不過 sally 不知道它到底是比真的輕還是重。

可喜的是, sally 有個朋友借他一個非常精準的天平,那個朋友同意讓 Sally 秤三次來找出假幣。例如,秤2個硬幣,結果天平平衡,那麼這2個都是真的。如果用其中的一個真的和第三個硬幣去秤,如果天平不平衡,那麼 sally就知道第三個硬幣是假的。同時他也可以根據天平來判斷那個假的到底是比真的輕還是重。Sally 會小心的選擇秤重的方法,這樣他才能用剛好秤三次找出那個硬幣是假的。

輸入說明 :

輸入的第一列有一個整數 n,代表以下有幾組測試資料。

每組測試資料三列,每列代表一次秤重。Sally 把他的硬幣編號為A~L。每次秤重左右兩邊的硬幣用2個字串表示(Sally 總是在左右兩邊放相同數目的硬幣),秤重的結果用 up, down, even 來表示,代表天平的右邊是往上,往下,還是平衡。請參考Sample Input。

輸出說明 :

對每一組測試資料輸出哪一個硬幣是假的,並且是較輕還是較重。請注意:答案一定是唯一的。輸出格式請參考Sample Output。

範例輸入 :

2
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
ABC DEF up
GHI JKL even
EF DA up

範例輸出 :

K is the counterfeit coin and it is light.
D is the counterfeit coin and it is light.

提示 :

* 中文翻譯:Lucky 貓

出處 :

ACM 608



作法 : 窮舉
舉出哪個硬幣是錯誤的,看是light or heavy
看三個條件,有沒有都符合就好哩
我以為是很繁複的做法,我真是被嚇到了,一嚇三年不敢寫

/**********************************************************************************/
/*  Problem: c093 "Counterfeit Dollar" from ACM 608                               */
/*  Language: C                                                                   */
/*  Result: AC (2ms, 262KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-30 17:27:59                                     */
/**********************************************************************************/


#include<stdio.h>
#include<string.h>
struct record {
    char l[13], r[13], st[4];
}D[3];
main() {
    int t, a, b, c, suml, sumr;
    scanf("%d", &t);
    while(t--) {
        for(a = 0; a < 3; a++)
            scanf("%s %s %s", &D[a].l, &D[a].r, &D[a].st);
        /*light*/
        for(a = 0; a < 12; a++) {
            for(b = 0; b < 3; b++) {
                suml = 0, sumr = 0;
                for(c = 0; D[b].l[c]; c++)
                    suml += (D[b].l[c] - 'A' != a);
                for(c = 0; D[b].r[c]; c++)
                    sumr += (D[b].r[c] - 'A' != a);
                if(suml == sumr && D[b].st[0] == 'e') continue;
                if(suml < sumr && D[b].st[0] == 'd') continue;
                if(suml > sumr && D[b].st[0] == 'u') continue;
                break;
            }
            if(b == 3)    break;
        }
        if(a != 12)
            printf("%c is the counterfeit coin and it is light.\n", a + 'A');
        /*heavy*/
        for(a = 0; a < 12; a++) {
            for(b = 0; b < 3; b++) {
                suml = 0, sumr = 0;
                for(c = 0; D[b].l[c]; c++)
                    suml += (D[b].l[c] - 'A' == a);
                for(c = 0; D[b].r[c]; c++)
                    sumr += (D[b].r[c] - 'A' == a);
                if(suml == sumr && D[b].st[0] == 'e') continue;
                if(suml < sumr && D[b].st[0] == 'd') continue;
                if(suml > sumr && D[b].st[0] == 'u') continue;
                break;
            }
            if(b == 3)    break;
        }
        if(a != 12)
            printf("%c is the counterfeit coin and it is heavy.\n", a + 'A');
    }
    return 0;
}