問題: みかんを重さごとに仕分ける
入力:
- 仕分ける重さの区切りを表す整数
N
- みかんの個数を表す整数
M
- 各みかんの重さ
w_1
からw_M
出力:
- 各みかんを最も近い重さに仕分け、その重さを出力
アプローチ:
- 標準入力から
N
,M
と各みかんの重さを読み込む - 各みかんの重さについて、仕分け先の重さを計算
- 仕分け先の重さを出力
コード:
def classify_oranges(weight, num_oranges, oranges):
# 各みかんの重さに対して仕分け先の重さを計算して出力
for orange in oranges:
# もし、みかんの重さがweight以下ならweightの箱に仕分け
if orange <= weight:
print(weight)
else:
# みかんの重さに最も近い下の区切りの重さを計算
lower_bound = (orange // weight) * weight
# みかんの重さに最も近い上の区切りの重さを計算
upper_bound = lower_bound + weight
# みかんの重さがlower_boundとupper_boundのどちらに近いかを判断
if (orange - lower_bound) < (upper_bound - orange):
print(lower_bound)
else:
print(upper_bound)
# 標準入力からデータを読み込む
import sys
input = sys.stdin.read().strip().split()
N = int(input[0]) # 仕分ける重さの区切り
M = int(input[1]) # みかんの個数
oranges = [int(input[i + 2]) for i in range(M)] # 各みかんの重さリスト
# みかんを仕分ける
classify_oranges(N, M, oranges)
コードの説明:
-
関数
classify_oranges
の定義:-
weight
: 仕分ける重さの区切り -
num_oranges
: みかんの個数 -
oranges
: 各みかんの重さのリスト
-
-
みかんの重さに対する仕分け先の重さの計算:
- 各みかんの重さ
orange
に対して以下の処理を行います:- もし
orange
がweight
以下なら、そのままweight
の箱に仕分けします。 - そうでない場合、
orange
に最も近い下の区切りの重さlower_bound
と、上の区切りの重さupper_bound
を計算します。 -
orange
とlower_bound
およびupper_bound
の距離を比較し、近い方の重さの箱に仕分けます。同じ距離の場合はupper_bound
を選択します。
- もし
- 各みかんの重さ
-
結果の出力:
- 各みかんの仕分け先の重さを順に出力します。
このプログラムは、与えられた各みかんの重さを最も近い重さに仕分けし、その結果を正確に出力します。