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

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

AtCoder ABC 325 B - World Meeting (5Q, 灰色, 250 点)

会議設定時間を 0 時、1 時、2 時、...、23 時をそれぞれ全探索するのが一番分かりやすいと思う!

問題概要

キーエンス社員の  N 個の拠点に対して同時に会議を設定したい。拠点  i には社員が  W_{i} 人いて、時差 (世界標準時で 0 時のときの時刻) は  X_{i} である。

今、会議を 1 時間設定したい。9:00〜18:00 の範囲内におさまる社員数が最も多くなるように会議時間を設定したときの、範囲内の社員数を答えよ。

考えたこと

色んな解法があるが、「時間帯を全探索」がわかりやすいと思う。つまり、 h = 0, 1, \dots, 23 に対して、世界標準時で  h 時から  h+1 時までの時間帯が 9:00〜18:00 の範囲におさまるような社員数を求めてあげて、その最大値を答えればよい。

拠点  i では、世界標準時で  h 時であるとき、(h + X[i]) % 24 時となることを活用しよう。

コード

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

int main() {
    int N;
    cin >> N;
    vector<long long> w(N), x(N);
    for (int i = 0; i < N; ++i) cin >> w[i] >> x[i];
    
    long long res = 0;
    for (int t = 0; t < 24; ++t) {
        long long num = 0;
        for (int i = 0; i < N; ++i) {
            int real_t = (t + x[i]) % 24;
            if (real_t >= 9 && real_t < 18) num += w[i];
        }
        res = max(res, num);
    }
    cout << res << endl;
}