Official

B - 生徒の成績管理 / Student Grade Management Editorial by kyopro_friends


与えられた情報を生徒ごとに分類し、各生徒の平均点を計算すればよいです。「 \(\mathrm{scores}[i]=\) 生徒 \(i\) の得点の配列(リスト)」とするような \(\mathrm{scores}\) を用意するのが簡単です。

実装例 (Python)

N, M, T = map(int, input().split())
scores = [[] for _ in range(N)]
for _ in range(M):
  c, s = map(int, input().split())
  scores[c-1].append(s)

ans = 0
for i in range(N):
  if len(scores[i]) and sum(scores[i]) / len(scores[i]) < T:
    ans += 1

print(ans)

なお、平均点を求めるには合計と件数がわかっていれば十分であるため、得点のリストの代わりにこれら 2 つの情報のみを管理することでも解けます。

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
  int n, m, t;
  cin >> n >> m >> t;
  vector<int>score_sum(n), score_count(n);
  for(int i=0; i<m; i++){
    int c, s;
    cin >> c >> s;
    c--;
    score_sum[c] += s;
    score_count[c] += 1;
  }

  int ans = 0;
  for(int i=0; i<n; i++){
    if(score_count[i] > 0 && (double) score_sum[i] / score_count[i] < t){
      ans++;
    }
  }
  cout << ans << endl;
}

どちらの方針でも計算量は \(O(N+M)\) となります。