FINAL問題 みかんの仕分け
N, M = map(int, input().split())
for _ in range(M):
w = int(input())
num = w / N
num_int = int(num)
is_heavy = (num - num_int >= 0.5)
g = N * num_int + is_heavy * N
if g == 0:
g = N
print(g)
例として w = 24, N = 10 の時で解説します。
重いほうの箱と軽いほうの箱に仕分けます。
まず入力 w
を N で割ります。num = w / N
そしてこの num
の整数部分の値を取ります。
num = 24 / 10 = 2.4
num_int = int(2.4) = 2 ← num の整数部分
num - num_int = 2.4 - 2 = 0.4 ← num の小数部分
is_heavy
は、num の小数部分の値が 0.5 以上の時は 1
(重いほうの箱に入れる) となり、0.5 未満の時は 0
(軽いほうの箱に入れる) となります。
※ この 0
と 1
の意味は「2章 bool型 True と False」をご覧ください。
g = 10 * 2 + is_heavy * N
↓
・is_heavy
が 1 の時
g = 10 * 2 + 1 * 10 = 30
・is_heavy
が 0 の時
g = 10 * 2 + 0 * 10 = 20
↓
{20, 21, 22, 23, 24}, {25, 26, 27, 28, 29, 30}
結果、20gの箱に入る。
こうしてみかんを仕分けして入れた箱に表示されている重さを画面に出力していき、ループを抜ければ完了となります。
もし、g
が 0 になった場合は、一番軽い N の箱に入れます。
N が 10 でなくてもいくつであっても、w / N
の小数部分を使えば四捨五入の要領で仕分けできますし、ループもしなくてイメージしやすく、ラクかなと。😅
ステップは必要と感じなかったので、FINAL問題以外はすっ飛ばしました。ご容赦を。
paiza の解答コード例を見て「continueってなんぞや?」と思ったら「3章 補足」で知ることができます。
おまけ
値を変えて検証します。
w = 18, N = 7 の時
num = 18 / 7 = 2.5(71428…)
num_int = int(2.5) = 2 ← num の整数部分
num - num_int = 2.5 - 2 = 0.5 ← num の小数部分
is_heavy = (2.5 - 2 >= 0.5) = True = 1
g = N * num_int + is_heavy * N
↓
g = 7 * 2 + is_heavy * N
↓
・is_heavy
が 1 の時
g = 7 * 2 + 1 * 7 = 21
・is_heavy
が 0 の時
g = 7 * 2 + 0 * 7 = 14
↓
{14, 15, 16, 17}, {18, 19, 20, 21}
結果、21gの箱に入る。ちなみに w = 17 は、
num = w / N = 2.4(28571…) だから 14gの箱に入る。
w = 3, N = 7 の時
num = 3 / 7 = 0.4(28571…)
num_int = int(0.4) = 0 ← num の整数部分
num - num_int = 0.4 - 0 = 0.4 ← num の小数部分
is_heavy = (0.4 - 0 >= 0.5) = False = 0
g = N * num_int + is_heavy * N
↓
g = 7 * 0 + is_heavy * N
↓
・is_heavy
が 1 の時
g = 7 * 0 + 1 * 7 = 7
・is_heavy
が 0 の時
g = 7 * 0 + 0 * 7 = 0
↓
{0, 1, 2, 3}, {4, 5, 6, 7}
0g の箱は無いので if g == 0:
最も軽い箱 7g の箱に入れる。g = N