2013国内予選 B. 整長方形

B. ICPCの順位付け

解法

  • シンプルなシミュレーションの問題
    • 基本的には問題文で言われたとおりに実装すれば良い
  • 順位付けはpairとか使って頑張っても良いけど、ここではoperatorを定義。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

class Score {
public:
    int teamID;
    int solved;
    int penalty;
    Score(int id) : teamID(id), solved(0), penalty(0) {}
    bool operator < (const Score& sc) const {
        if(solved != sc.solved) return solved < sc.solved;
        if(penalty != sc.penalty) return penalty > sc.penalty;
        return teamID < sc.teamID;
    }
    bool operator == (const Score& sc) const {
        return solved == sc.solved && penalty == sc.penalty;
    }
};

int main(){
    int M, T, P, R;
    int submit[50][10];
    while(cin >> M >> T >> P >> R && M){
        memset(submit, 0, sizeof(submit));
        vector<Score> vs;
        for(int i=0;i<T;i++) vs.push_back(Score(i+1));
        for(int i=0;i<R;i++){
            int m, t, p, j;
            cin >> m >> t >> p >> j;
            --t; --p;
            if(j != 0) submit[t][p]++;
            else {
                vs[t].solved++;
                vs[t].penalty += m + 20*submit[t][p];
            }
        }
        sort(vs.rbegin(), vs.rend());
        cout << vs[0].teamID;
        for(int i=1;i<vs.size();i++){
            if(vs[i] == vs[i-1]) cout << "=" << vs[i].teamID;
            else                 cout << "," << vs[i].teamID;
        }
        cout << endl;
    }
}