公式
A - アルバイトの給料計算 / Calculating Part-Time Job Pay 解説 by admin
Gemini 3.0 Flash (Thinking)概要
\(N\) 種類のアルバイトについて、それぞれの「時給 \(\times\) 労働時間」を計算し、その総和を求める問題です。
考察
各アルバイトで得られる給料は、以下の計算式で求められます。 - 1番目のアルバイト:\(A_1 \times T_1\) 円 - 2番目のアルバイト:\(A_2 \times T_2\) 円 - … - \(N\) 番目のアルバイト:\(A_N \times T_N\) 円
これらをすべて合計したものが、高橋君が受け取る今月の給料の総額となります。 数式で表すと、求める答えは \(\sum_{i=1}^{N} (A_i \times T_i)\) です。
制約と注意点
- 計算量: \(N\) が最大 \(10^5\) なので、1つずつ順番に計算して足し合わせる処理を \(N\) 回繰り返せば、制限時間内に十分間に合います。
- 数値の大きさ: 答えの最大値は \(N \times A_i \times T_i = 10^5 \times 10^6 \times 10^6 = 10^{17}\) 程度になります。非常に大きな数値になりますが、Pythonは標準で多倍長整数(いくらでも大きな桁を扱える型)をサポートしているため、特別な対策をせずにそのまま計算しても正解できます。
アルゴリズム
- 合計金額を保持する変数
total_salaryを \(0\) で初期化します。 - 入力から \(N\) を受け取ります。
- 以下の処理を \(N\) 回繰り返します(\(i = 1, 2, \dots, N\)):
- \(i\) 番目のアルバイトの時給 \(A_i\) と労働時間 \(T_i\) を受け取ります。
- \(A_i \times T_i\) を計算し、その結果を
total_salaryに加算します。
- 最終的な
total_salaryの値を出力します。
計算量
- 時間計算量: \(O(N)\) \(N\) 個のアルバイトについて 1 回ずつ掛け算と足し算を行うため、処理時間は \(N\) に比例します。
- 空間計算量: \(O(N)\)
今回の実装では
sys.stdin.read().split()を用いて入力データをすべて一度にリストへ格納しているため、入力の個数 \(N\) に比例したメモリを使用します。
実装のポイント
高速な入力: \(N\) が \(10^5\) と大きいため、
input()を \(N\) 回呼び出すよりも、sys.stdin.read().split()を使って一括で読み込む方が実行時間を短縮できます。インデックスの管理: 一括読み込みをした場合、リストの 0 番目が \(N\)、1 番目以降に \(A_1, T_1, A_2, T_2, \dots\) と並びます。\(i\) 番目のアルバイトの情報がリストのどこにあるかを
2 * i + 1のような式で正しく指定することが重要です。ソースコード
import sys
def main():
# 標準入力からすべてのデータを読み込み、空白文字で分割します
input_data = sys.stdin.read().split()
# 入力が空の場合は終了します
if not input_data:
return
# 最初の値はアルバイトの種類数 N です
n = int(input_data[0])
total_salary = 0
# 各アルバイトの時給 A_i と 働いた時間 T_i を順に処理します
for i in range(n):
# input_data[1] から順に A1, T1, A2, T2, ... と並んでいます
a = int(input_data[2 * i + 1])
t = int(input_data[2 * i + 2])
# 給料を加算します
total_salary += a * t
# 合計金額を出力します
print(total_salary)
if __name__ == '__main__':
main()
この解説は gemini-3-flash-thinking によって生成されました。
投稿日時:
最終更新: