Hatena::Grouptopcoder

TopCoderの問題を解く

解いた問題の一覧表

2009-08-16

CircleGame

| 17:07

問題文

カードの13(King)と隣接したカード数が13になる場合は、それらの数を抜き、最後に残るデッキのカードの数を求める。問題を連続する数が13になる場合に抜くと、読み間違えてしまって、解くのに時間がかかった。

103.92/250

class CircleGame {
    public:
        int cardsLeft(string deck) {
            map<char,int> toNum;
            toNum['A']=1; toNum['2']=2; toNum['3']=3; toNum['4']=4; toNum['5']=5;
            toNum['6']=6; toNum['7']=7; toNum['8']=8; toNum['9']=9; toNum['T']=10;
            toNum['J']=11; toNum['Q']=12; toNum['K']=13;
            while (true) {
                string::size_type p = deck.find('K');
                if (p == string::npos) break;
                deck.erase(p, 1);
            }
            bool changed = true;
            while (changed) {
                changed = false;
                for (int i = 0; i < deck.size(); i++) {
                    int j = (i+1) % deck.size();
                    if (toNum[deck[i]]+toNum[deck[j]] == 13) {
                        changed = true;
                        string next;
                        for (int k = 0; k < deck.size(); k++)
                            if (k!=i && k!=j)
                                next += deck[k];
                        deck = next;
                        break;
                    }
                }
            }
            return deck.size();
        }
};

JustinJustin2012/07/09 19:31I see, I supospe that would have to be the case.

itwtrmfvceitwtrmfvce2012/07/10 15:227kAAqh <a href="http://zylafgrfzjbl.com/">zylafgrfzjbl</a>

cdweglzcdweglz2012/07/10 21:17xepmZu , [url=http://onfgnghtzitt.com/]onfgnghtzitt[/url], [link=http://nlacaozvfktq.com/]nlacaozvfktq[/link], http://aepzieiyvpsn.com/

hkdwpsqnvkhkdwpsqnvk2012/07/12 17:09QYS2QK , [url=http://toyoaqaciajc.com/]toyoaqaciajc[/url], [link=http://bwrudfijrmmm.com/]bwrudfijrmmm[/link], http://zvmupojzjimj.com/

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;
    }
};