ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC208 C - Fair Candy Distribution【Python解答例】

f:id:ebisuke33:20210705224035p:plain


AtCoder Beginner Contest208のC問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 208 - AtCoder



AtCoder Beginner Contest208 C - Fair Candy Distribution

C - Fair Candy Distribution

問題文

高橋王国には N 人の国民がいます。 全ての国民には国民番号が割り振られており、 i 人目の国民の国民番号は ai です。ここで、ai は互いに異なります。

高橋君は K 個のお菓子を持っています。高橋君は次のルールに従って、持っているお菓子が無くなるまで国民にお菓子を配ることにしました。

・持っているお菓子が N 個以上ある場合、全員に 1 個ずつお菓子を配る。
・そうでない場合、その時点で高橋くんが持っているお菓子の個数を K′ として、国民番号が小さい方から K′ 人に 1 個ずつ配る。より厳密には、ai の値が小さい方から K′ 人を選び、選んだ人に 1 個ずつお菓子を配る。
全てのお菓子を配り終えたとき、i 人目の国民は何個のお菓子を持っていますか?

制約

・1≤N≤2×10^5
・1≤K≤10^18
・1≤ai≤10^9
・ai は互いに異なる。
・入力は全て整数である。

解答例

n, k = map(int,input().split())

A = list(map(int, input().split()))

tmp = k // n

k = k % n

ans = [tmp for _ in range(n)]

order = []
for i in range(n):
    order.append([A[i], i])

order.sort()

for i in range(k):
    ans[order[i][1]] += 1

for a in ans:
    print(a)

解説

N人の国民にK個のお菓子を配るときi番目の人がもらえるお菓子の個数を答える問題です。
N人に平等に配れないときは国民番号が小さい順に配ります。

N個以上お菓子があるときはすべての国民にk // n個だけ配ることができます。

余りのk % n個は国民番号が小さい順に配るため、i番目の人を国民番号が小さい順に並び替えたときの順番を求める必要があります。
order配列には国民番号A[i]とiを格納していきました。
このorder配列を国民番号についてソートすることで配る順番が決まります。

続いてのループでk個残ったお菓子をorder配列を用いて国民番号が小さい順に配りました。

最後にi番目の人のお菓子の数ansを出力していくことでACでした。




ABC208の関連記事はこちら
ebisuke33.hatenablog.com