【思維】poj 1013 Counterfeit Dollar

CN_swords發表於2017-03-26
/*
poj 1013 Counterfeit Dollar
題意:一個案例包含三行,每行三個字串,分別代表左邊放的東西和右邊放的東西,以及結果,讓你分辨出哪個是假的。
題解:腦洞題, 如果even,那麼這兩邊東西一定是真,真的物品我用較大的數表示,這裡只有3個資料,100可以算大了。
如果up,那麼要麼左邊東西有假的偏重,要麼右邊東西有假的偏輕。我們分別附上可能為假的權值(輕-1,重+1)。
如果down,反之。
最後我們只要找是假的權值最大的那個即可。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;

int mp[N];
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        memset(mp,0,sizeof(mp));
        for(int i = 0; i < 3; i++)
        {
            string a,b,c;
            cin >> a >> b >> c;
            if(c == "even")
            {
                for(int i = 0; i < a.size(); i++)
                    mp[a[i]-'A'] = 100;
                for(int i = 0; i < b.size(); i++)
                    mp[b[i]-'A'] = 100;
            }
            else if(c == "up")
            {
                for(int i = 0; i < a.size(); i++)
                    mp[a[i]-'A']++;
                for(int i = 0; i < b.size(); i++)
                    mp[b[i]-'A']--;
            }
            else
            {
                for(int i = 0; i < a.size(); i++)
                    mp[a[i]-'A']--;
                for(int i = 0; i < b.size(); i++)
                    mp[b[i]-'A']++;
            }
        }
        int ans = 0;
        int id;
        for(int i = 0; i < 12; i++)
        {
            if(mp[i] < 50)
            {
                if(ans < abs(mp[i]))
                {
                    ans = abs(mp[i]);
                    id = i;
                }
            }
        }
        printf("%c is the counterfeit coin and it is ",id+'A');
        if(mp[id] < 0)
            printf("light.\n");
        else
            printf("heavy.\n");
    }
    return 0;
}

相關文章