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部