Official

B - 遠足のおやつ選び / Choosing Snacks for a Field Trip Editorial by MMNMM


\(a\le b\) かつ \(a\le c\) であることは、\(a\le\min\lbrace b,c\rbrace\) であることと同値です。

よって、\(R _ i\le S _ j\ (1\le j\le M)\) は \(\displaystyle R _ i\le\min _ {1\le j\le M}S _ j\) と同値です。 はじめに \(\displaystyle\min _ {1\le j\le M}S _ j\) の値を求めておくことで、それぞれの \(i\) に対して \(\displaystyle R _ i\le\min _ {1\le j\le M}S _ j\) かどうかを定数時間で求めることができます。

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

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

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

    vector<int> R(N);
    for (int& r : R) {
        cin >> r;
    }

    // S の最小値を求める
    int min_S = 1000000000;
    for (int i = 0; i < M; ++i) {
        int S;
        cin >> S;
        min_S = min(min_S, S);
    }

    // 答えを求める
    int ans = 0;
    for (int r : R) {
        if (r <= min_S) { // R[i] <= min S[j] なら
            ++ans; // 答えを増やす
        }
    }

    cout << ans << endl;
    return 0;
}
N, M = map(int, input().split())

R = list(map(int, input().split()))

# S の最小値を求める
min_S = min(map(int, input().split()))

# 答えを求める
ans = 0
for r in R:
    if r <= min_S: # R[i] <= min S[j] なら
        ans += 1 # 答えを増やす

print(ans)

posted:
last update: