けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 一次予選 2023 (第 3 回) D - マラソン大会 (6Q, 難易度 2)

愚直に数えるのが簡単だと思う。

問題概要

 N 人の生徒のマラソン大会のタイム  A_{1}, A_{2}, \dots, A_{N} が与えられる。

各生徒の順位を求めよ。具体的には各生徒  i について、( A_{i} 未満のタイムの個数) + 1 を求めよ。

制約

  •  1 \le N \le 100

解法

 i に対して、具体的に「( A_{i} 未満のタイムの個数) + 1」を求めることにしよう。

全体的に次のようなコードで実現できる。

for (int i = 0; i < N; ++i) {
    // A[i] よりも小さいものを数える
    int res = 0;
    for (int j = 0; j < N; ++j) {
        if (A[j] < A[i]) ++res;
    }
    
    // res + 1 が答え
}

あとは、プログラム全体を整えよう。

コード

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

int main() {
    int N;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];

    for (int i = 0; i < N; ++i) {
        int res = 0;
        for (int j = 0; j < N; ++j) {
            if (A[j] < A[i]) ++res;
        }
        cout << res + 1 << endl;
    }
}