C-merのブログ

ザ・雑記

SRM 500 Div 1 - Problem 250 MafiaGame

問題
SRM 500 Div 1 - Problem 250 MafiaGame
TopCoder Statistics - Problem Statement

使用言語
C++

方針
・最も投票された人にのみ注目
・N人の人が残る候補者にどう投票するかでループ

所感
・問題文理解できなかったり,スペルわからなくなったり,英弱の極みという感じだった.
・複雑に考えちゃいけない問題

コード

vector<int> vote(555, 0);

class MafiaGame {
    public:
    double probabilityToLose(int N, vector<int> decisions) {
      int size = decisions.size();
      for (size_t i = 0; i < size; i++) {
        vote[decisions[i]]++;
      }

      //最も投票された回数
      int maxvote = *max_element(vote.begin(), vote.end());
      //最も投票された人の人数
      int maxnum = count(vote.begin(), vote.end(), maxvote);

      //最も投票された人でも1票ということは,全員1票で無限ループ
      if (maxvote == 1 && N != 1) return 0.0;
      //単独で最多投票獲得数ならばその人が敗者決定
      if (maxnum == 1) return 1.0;

      //ここで候補を絞る
      //N票しか存在しないので,候補者がmaxnum以上になることはない
      //確実に入れる人の数は同じなので,全員ランダムとみなして問題ない
      //一人になったら終了
      int candidate = maxnum;
      while (candidate != 1) {
        //次の投票数が最多の人の人数を計算
        candidate = N % candidate;
        //(mod 0)==投票数が最多の人の人数が変化しない==無限ループ
        if (candidate == 0) return 0.0;
      }

      //maxnum人の中誰が候補者になっておかしくなかった.
        return 1.0 / maxnum;
    }
};

主に要約など参考:
Top Coder Single Round Match 500 Div1 - 練習帳 - TopCoder部