2013国内予選 B. 整長方形
解法
- シンプルなシミュレーションの問題
- 基本的には問題文で言われたとおりに実装すれば良い
- 順位付けは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; } }