公式

B - テストの順位 / Test Ranking 解説 by physics0523


以下の流れでこの問題に正解できます。

  1. 各生徒の得点を求める。
  2. 点数が同じ生徒をひとつのグループにまとめた上で、点数の降順に順位を付ける。
  3. 生徒の番号順に答えを出力する。

2. について、連想配列が活用できる言語であれば少し実装を楽にすることができます。
連想配列 \(mp\) をキーが整数、値が整数の配列であるようなものとします。 C++ の場合は map<int,vector<int>> などがこれに対応します。
生徒 \(s\) の得点が \(p\) だとして、 \(mp[-p]\) に \(s\) を追加すると取り決め、キーの昇順に調べていくことで、点数が同じ生徒をひとつのグループにまとめながら、点数の降順に順位を付けることが簡単に実装できます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int N,M;
  cin >> N >> M;
  vector<int> P(M);
  for(auto &nx : P){cin >> nx;}
  map<int,vector<int>> mp;
  for(int i=0;i<N;i++){
    string s;
    cin >> s;
    int total=0;
    for(int j=0;j<M;j++){
      if(s[j]=='o'){total+=P[j];}
    }
    mp[-total].push_back(i);
  }
  vector<int> res(N);
  int rank=1;
  for(auto &nx : mp){
    for(auto &ny : nx.second){res[ny]=rank;}
    rank+=nx.second.size();
  }
  for(auto &nx : res){cout << nx << "\n";}
  return 0;
}