Official

A - 合格者数の集計 / Counting the Number of Successful Applicants Editorial by MMNMM


初心者の方へ

この問題は、与えられる \(B _ {i,j}\ (1\le i\le N,1\le j\le A _ i)\) の値のうち、\(K\) 以上であるものがいくつあるかを求めることで解くことができます。

問題の入力形式に従って正しく \(B _ {i,j}\) を読み込むことができれば、if 文などを使って答えを求めることができます。 デバッグの際には、読み込んだ \(B _ {i,j}\) をそのまま出力してみて、想定通りの値を読み込めているか確認するのもよいでしょう。

実装例は以下のようになります。

#include <iostream>
using namespace std;

int main(){
    int N, K;
    cin >> N >> K;

    int ans = 0; // 合格者数のカウンター
    for (int i = 0; i < N; ++i) {
        int A;
        cin >> A; // 人数を読み込んで
        for (int j = 0; j < A; ++j) { // 人数分の点数を読み込む
            int B;
            cin >> B;
            if (B >= K) { // 点数が合格点以上なら
                ++ans; // 合格者数を増やす
            }
        }
    }

    cout << ans << endl; // 答えを出力
    return 0;
}
N, K = map(int, input().split())

ans = 0 # 合格者数のカウンター
for _ in range(N):
    A, *B = map(int, input().split()) # 人数と点数に分けて読み込む
    for b in B: # それぞれの点数について
        if b >= K: # 合格点以上なら
            ans += 1 # 合格者数を増やす

print(ans) # 答えを出力

入力される \(B\) を正しく読み込んだあとの処理については、「リストからなるリストをすべて連結して \(1\) つのリストにする」や「リストに含まれる要素のうち条件を満たすものの個数をカウントする」などの機能が用意されている言語では、答えを求めるための実装量をより少なくできる場合があります。

#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges>
using namespace std;

int main(){
    int N, K;
    cin >> N >> K;

    vector<vector<int>> B(N); // 点数を入れる(可変長)配列の(可変長)配列
    for (int i = 0; i < N; ++i) {
        int A;
        cin >> A; // 人数を読み込んで

        B[i].resize(A);
        for (int& b : B[i]) {
            cin >> b; // 人数分点数を読み込む
        }
    }

    cout << ranges::count_if( // 列から条件を満たす要素を数える関数
        B | views::join, // 配列の配列を連結してひとつの列にまとめる
        [K](int b) { return b >= K; } // 点数が K 以上であるかを判定する
    ) << endl;
    return 0;
}
N, K = map(int, input().split())

B = [list(map(int, input().split()))[1:] for _ in range(N)] # 各行を先頭だけ除いて読み込む

print(len([b for line in B for b in line if b >= K])) # リストのリストを順に見て、K 以上のものだけ残した個数が答え

posted:
last update: