AOJ 1187 ICPC Ranking (ICPC国内予選2013問題B)

模擬国内予選2012問題Bとよく似た問題でコンテストの提出履歴が与えられた時にICPCルールで順位付けをしてチーム番号を順位の高い方から出力します。C++なら比較関数を用意してソートするとよいです。

この問題では順位が同一のときには、それらのチーム間をカンマでなく'='で区切る必要があるので気をつけましょう。また正解していない問題に対してはペナルティは加算されない点にも注意しましょう。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Team{
    vector<bool> is_solve;
    vector<int> WA;
    int team_id, time, solved;
    Team(){}
    Team(int P, int id){
        is_solve = vector<bool>(P, false);
        WA = vector<int>(P, 0);
        team_id = id;
        time = 0;
        solved = 0;
    }
};
bool operator<(const Team &a, const Team &b){
    if( a.solved == b.solved ){
        if( a.time == b.time ){
            return a.team_id > b.team_id;
        }
        return a.time < b.time;
    }
    return a.solved > b.solved;
}
bool operator==(const Team &a, const Team &b){
    return a.solved == b.solved && a.time == b.time;
}

int main(){
    int M, T, P, R;
    while( cin >> M >> T >> P >> R, M ){
        vector<Team> v;
        for(int i = 0; i < T; i++){
            v.push_back( Team(P, i) );
        }
        
        for(int i = 0; i < R; i++){
            int m, t, p, j;
            cin >> m >> t >> p >> j;
            t--; p--;
            if( j == 0 ){ // Correct Answer
                for(int k = 0; k < v.size(); k++){
                    if( v[k].team_id == t ){
                        v[k].is_solve[p] = true;
                        v[k].solved++;
                        v[k].time += m;
                        v[k].time += 20 * v[k].WA[p];
                        break;
                    }
                }
            }else{ // Wrong Answer
                for(int k = 0; k < v.size(); k++){
                    if( v[k].team_id == t ){
                        v[k].WA[p]++;
                        break;
                    }
                }
            }
        }
        
        sort(v.begin(), v.end());
        for(int i = 0; i < v.size(); i++){
            if( i ){
                bool flag = (v[i-1] == v[i]);
                cout << (flag? "=" : ",");
            }
            cout << v[i].team_id + 1;
        }
        cout << endl;
    }
}