Topcoder SRM148 Div1 Level 1 CircleGame

問題


http://community.topcoder.com/stat?c=problem_statement&pm=1735&rd=4545

解法


0は飛び越えて,隣接する数の和が13になるものを0にしていく.

コード

#include <bits/stdc++.h>
#include <stdint.h>
#include <sys/time.h>

class CircleGame {
public:
  int cardsLeft(std::string deck) {
    int num[64];
    int n = deck.size();

    for(int i = 0; i < n; ++i) {
      switch( deck[i] ) {
      case 'A' :
        num[i] = 1; break;
      case '2' ... '9' :
        num[i] = deck[i] - '0'; break;
      case 'T' :
        num[i] = 10; break;
      case 'J' :
        num[i] = 11; break;
      case 'Q' :
        num[i] = 12; break;
      case 'K' :
        num[i] = 0; break;
      };
    }

    for(int i = 0; i < n; ++i) {
      for(int left = 0; left < n; ++left) {
        if( num[left] != 0 ) {
          int right;
          for(right = (left + 1) % n; num[right] == 0; right = (right + 1) % n) ;
          if( num[left] + num[right] == 13 ) {
            num[left] = num[right] = 0;
          }
        }
      }
    }
    
    int res = 0;
    for(int i = 0; i < n; ++i) {
      if( num[i] != 0 ) {
        res += 1;
      }
    }

    return res;
  }
};