Hatena::Grouptopcoder

TopCoderの問題を解く

解いた問題の一覧表

2009-05-04

MNS

| 06:13

問題文

541.75->986.47 / 1000

全ケースを試す方法で解けた。

class MNS {
public:
    int combos(vector <int> numbers) {
        sort(numbers.begin(), numbers.end());
        int counter = 0;
        do {
            const static int d[6][3] = {
                { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 },
                { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 } };
            const int sum = numbers[0] + numbers[1] + numbers[2];
            for (int i = 1; i < 6; i++) {
                if (sum != (numbers[d[i][0]]+numbers[d[i][1]]+numbers[d[i][2]])) {
                    break;
                } else if (i == 5) {
                    counter++;
                    break;
                }
            }
        } while (next_permutation(numbers.begin(), numbers.end()));
        return counter;
    }
};

CeyKaps

| 18:36

問題文

383.68->596.73 / 600

switches の通りにキー配列を交換する変換テーブルを作り、typed の文字列をその変換テーブルに通す。

class CeyKaps {
public:
    string decipher(string typed, vector <string> switches) {
        vector<char> kaps(26);
        for (int i = 0; i < 26; i++) {
            kaps[i] = 'A' + i;
        }
        for (int i = 0; i < switches.size(); i++) {
            int pa = find(kaps.begin(), kaps.end(), switches[i][0]) - kaps.begin();
            int pb = find(kaps.begin(), kaps.end(), switches[i][2]) - kaps.begin();
            swap(kaps[pa], kaps[pb]);
        }

        string result(typed);
        for (int i = 0; i < typed.length(); i++) {
            result[i] = kaps[typed[i]-'A'];
        }
        return result;
    }
};

DivDigits

| 18:36

問題文

245.29->249.16->249.64 / 250

number に含まれる各桁の数が number の約数かどうか調べ、その約数の数を数える問題。0割りに注意。

class DivisorDigits {
public:
    int howMany(int number) {
        int tNum = number;
        int counter = 0;
        while (tNum > 0) {
            int t = tNum % 10;
            if (t != 0 && number%t == 0)
                counter++;
            tNum /= 10;
        }
        return counter;
    }
};