読者です 読者をやめる 読者になる 読者になる

日々精進

aikoと旅行とプログラミングと

【AOJ 1187】ICPC Ranking

問題

ICPC Ranking | Aizu Online Judge

ソースコード

#include <algorithm>
#include <iostream>
#include <cstring>

using namespace std;

#define rep(i,n) REP(i,0,n)
#define REP(i,a,n) for(int i = a ; i < n ; i++)
#define T_MAX 50

struct SCORE{
  int id;
  int ac;
  int penalty;

  bool operator < (const SCORE& another) const{ 
    
    if(ac == another.ac){
      if(penalty == another.penalty){
        return id > another.id;
      }else{
        return penalty < another.penalty; 
      }
    }else{
      return ac > another.ac;
    }
  
  }
};

SCORE s[T_MAX];
int submit[T_MAX+1][T_MAX+1];

void init(int t){
  rep(i,t){
    s[i].id = i+1;
    s[i].ac = s[i].penalty = 0;
  }
  memset(submit, 0, sizeof(submit));
  return;
}

int main(){
  int m, t, p, r;

  while(cin >> m >> t >> p >> r, m){
    init(t);
  
    rep(i,r){
      int m_i, t_i, p_i, j_i;
      cin >> m_i >> t_i >> p_i >> j_i;
      if(j_i != 0){
        submit[t_i][p_i]++;
      }else{
        s[t_i-1].ac++;
        s[t_i-1].penalty += (m_i + submit[t_i][p_i] * 20); 
      }
    }

    sort(s, s+t);
    
    cout << s[0].id;
    
    SCORE prev;
    REP(i,1,t){
      prev = s[i-1];
      if(s[i].ac == prev.ac && s[i].penalty == prev.penalty){
        cout << "=";
      }else{
        cout << ",";
      }
      cout << s[i].id;
    }

    cout << '\n';
  }

}

似たような問題(You Are the Judge | Aizu Online Judge)を以前に解いたので、同じような方針で実装した。