TopCoder SRM 393 Div1 Easy InstantRunoffVoting

問題

n人の人が、m人の候補に対して投票して、一人の代表を決定する。
投票は次のルールで行われる。

最初、n人はそれぞれm人に対して順位をつける。
残っている人が二人以上の間、

  • n人は残っている人の中でつけた順位が最も高い人に投票する。
  • 過半数の票を獲得した人がいたらその人が代表になる。
  • そうでないとき、票数が最も少なかった人(複数いた場合全員)を候補から消す。
  • 全員がタイだった場合、代表者はなし。

各人がつけた順位があたえられるとき、代表として選ばれる人をもとめよ。
代表者がいなかった場合は-1を返せ。

制約条件

n≦50
m≦10

方針

定義にしたがって実装する。

ソースコード

class InstantRunoffVoting {
  public:
  int winner(vector <string> voters) {
    vi cand;
    int n=voters.size(), m=voters[0].size();
    rep(i,m)cand.pb(i);
    while(cand.size()>1){
      m=cand.size();
      vector<pi> vote(m);
      rep(i,m)vote[i]=mp(0,cand[i]);
      rep(i,n){
        rep(j,voters[0].size())rep(k,m)if(vote[k].second==voters[i][j]-'0'){
          vote[k].first++; goto NEXT;
        }
        NEXT:;
      }
      sort(all(vote));
      if(vote[m-1].first*2>n)cand=vi(1,vote[m-1].second);
      else{
        int p=0;
        for(;p<m&&vote[0].first==vote[p].first;p++){
          rep(i,cand.size())if(cand[i]==vote[p].second)cand.erase(cand.begin()+i);
        }
      }
    }
    return cand.empty()?-1:cand[0];
  }
};