Official

D - World Meeting Editorial by yuto1115

解説

まず、長さ \(24\) の配列 \(\mathrm{cnt}\) を以下のように定義します。

\[\mathrm{cnt}[j]=(X_i=j\text{ であるような拠点に所属している社員の総数)}\]

世界標準時における会議の開始時刻を全探索することを考えます。このとき、開始時刻として考えるべきは 0:00, 1:00, …, 23:00 の \(24\) 通りです(中途半端な時刻に開始しても得しないことが証明できます)。

開始時刻を世界標準時で \(t\) 時ちょうどに固定します。このとき、拠点 \(i\) の社員が会議に参加できる条件は \(9 \leq (t+X_i)\bmod 24 < 18\) です(\(x\bmod 24\)\(x\)\(24\) で割ったあまりを表します)。これは \((9-t) \bmod 24 \leq X_i < (18-t)\bmod 24\) と変形できるので、この会議に参加できる社員の総数は \(\mathrm{cnt}[(9-t) \bmod 24] + \mathrm{cnt}[(10-t) \bmod 24] +\dots + \mathrm{cnt}[(17-t) \bmod 24] \) と計算できます。

よって、これを用いて \(24\) 通りの開始時刻すべてに対して参加できる社員の総数を計算し、その最大値を出力すればよいです。

なお、単に \(i=0,1,...,23\) に対する \(\mathrm{cnt}[i \bmod 24] + \mathrm{cnt}[(i+1) \bmod 24] +\dots + \mathrm{cnt}[(i+8) \bmod 24] \) の最大値を計算しても正しい答えが求まることが示せます。下記の実装例ではこの方針を用いています。

実装例 (C++) :

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> cnt(24);
    for (int i = 0; i < n; i++) {
        int w, x;
        cin >> w >> x;
        cnt[x] += w;
    }
    int ans = 0;
    for (int i = 0; i < 24; i++) {
        int sum = 0;
        for (int j = 0; j < 9; j++) {
            sum += cnt[(i + j) % 24];
        }
        ans = max(ans, sum);
    }
    cout << ans << endl;
}

実装例 (Python) :

n = int(input())
cnt = [0 for _ in range(24)]
for i in range(0, n):
    w, x = map(int, input().split())
    cnt[x] += w

ans = 0
for i in range(24):
    sum = 0
    for j in range(9):
        sum += cnt[(i + j) % 24]
    ans = max(ans, sum)
    
print(ans)

posted:
last update: