B - バッテリー残量 / Battery Level 解説 by admin
GPT 5.2 High概要
各スマートフォンのバッテリーは「毎秒一定量減り、0未満にはならない」ので、時刻 \(T\) の残量を式で直接求めて全台分を合計します。
考察
スマートフォン \(i\) のバッテリー残量は、毎秒 \(B_i\) mAh ずつ減るため、単純に考えると時刻 \(T\) では
\(A_i - B_i \times T\) だけ残っていそうです。
ただし問題文の通り、残量が \(0\) になったら電源が切れてそれ以上減りません(負の値にならない)。
よって実際の残量は
- \(A_i - B_iT > 0\) のとき:そのまま \(A_i - B_iT\)
- \(A_i - B_iT \le 0\) のとき:\(0\)
つまり、残量は \( \max(0, A_i - B_iT)\) です。
素朴に「1 秒ずつシミュレーション」すると、\(T\) が最大 \(10^9\) なので \(O(NT)\) となり到底間に合いません(TLE)。
この問題は 時刻 \(T\) の値が欲しいだけなので、各端末を1回ずつ見て式で計算すれば十分です。
例:\(A=10, B=3, T=4\) のとき
\(A-BT = 10-12 = -2\) ですが、負にはならないので残量は \(0\) です。
アルゴリズム
- 合計
total = 0を用意する。 - 各スマートフォンについて:
rem = A_i - B_i * Tを計算rem > 0ならtotal += rem(そうでなければ加算しない=0を足すのと同じ)
totalを出力する。
これは \( \sum_{i=1}^{N} \max(0, A_i - B_iT)\) をそのまま計算しています。
計算量
- 時間計算量: \(O(N)\)(各スマホを1回ずつ計算)
- 空間計算量: \(O(1)\)(合計など定数個の変数のみ)
実装のポイント
B_i * Tは最大で \(10^9 \times 10^9 = 10^{18}\) になり得ます。Python のintは任意精度なので問題ありません(他言語では 64-bit 整数を使う)。max(0, rem)でもよいですが、コードではrem > 0のときだけ足すことで同じ処理をしています。入力が最大 \(2 \times 10^5\) 行あるため、高速入力として
sys.stdin.buffer.readlineを使うと安全です。ソースコード
import sys
def main():
input = sys.stdin.buffer.readline
N, T = map(int, input().split())
total = 0
for _ in range(N):
A, B = map(int, input().split())
rem = A - B * T
if rem > 0:
total += rem
print(total)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
投稿日時:
最終更新: