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: