AOJ 1187: ICPC Ranking

問題

ICPC Ranking | Aizu Online Judge

  • ICPCっぽいコンテストの提出履歴から順位を決定せよ
  • 順位は、解いた問題数が多い順・解いた問題数が同じならかかった時間が短い順に決まる
  • 異なる順位ならカンマ区切り、同順位なら=区切りで出力せよ
  • 同順位ならチーム番号の大きい順に出力すること

方針

各チームのAC数と時間をクラスで保持しておいて<演算子オーバーロード

#include <bits/stdc++.h>
  
using namespace std;
typedef long long ll;
  
#define rep(i, n) for(int i=0; i<(n); ++i)
 
class team {
public:
    int id, solve, time, miss[11];
    bool operator<(const team & rhs) const{
        if(solve > rhs.solve) return true;
        else if(solve==rhs.solve && time < rhs.time) return true;
        else if(solve==rhs.solve && time == rhs.time && id > rhs.id) return true;
        return false;
    }
};
int main(void){
    int M, T, P, R;
    int m, t, p, j;
    team teams[51];
    while(cin >> M >> T >> P >> R && M) {
        rep(i, T) {
            teams[i].id = i+1;
            teams[i].solve = 0;
            teams[i].time = 0;
            rep(j, P+1) teams[i].miss[j] = 0;
        }
        rep(i, R) {
            cin >> m >> t >> p >> j;
            t--;
            if(j == 0) {
                teams[t].solve++;
                teams[t].time += m + teams[t].miss[p] * 20;
            } else {
                teams[t].miss[p]++;
            }
        }
        sort(teams, teams+T);
        rep(i, T-1) {
            cout << teams[i].id;
            if(teams[i].solve==teams[i+1].solve && teams[i].time==teams[i+1].time) {
                cout << "=";
            } else {
                cout << ",";
            }
        }
        cout << teams[T-1].id << endl;
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1893831

反省