0
0

More than 1 year has passed since last update.

円周上の扱いについて-ABC214 C問題(python)-

Last updated at Posted at 2022-02-10

C - Distribution

ABC214C問題では、

条件は
・N人が円周上に並んでいる
・円周上の人は時刻Tに宝石をもらう
・宝石をもらってからS時間後に、円周の隣の人に宝石を渡す
となります。
このため、円周上の人が最初に宝石をもらう時刻は、
"時刻Tに宝石をもらう"か"前の人が宝石をもらった時刻+前の人の時刻S"
のいずれかになります。

次に考えなくてはならないのがスタート位置です。円周上の人は円周の前の人から宝石をもらうので、宝石をもらう時刻は円周の前の人の影響を受けます。
便宜上、円周上のn番目の人を考えてみます。n-1番目の人が宝石をもらった時刻というのは、
Ti+Si+T(i+1)+S(i+1)・・・T(n-1)と考えられます。n-1番目の人の影響を受ける場合というのは、
Ti+Si+T(i+1)+S(i+1)・・・T(n-1)<Tnとなる時です。
即ち、Tが最も小さい人をスタート位置にすると前の人の影響を受けないと考えました。

また、今回円周を配列として扱います。配列の最後の番号はN-1なので、配列の番号であるkの値がNになった時、k=0とすることで円の問題に対応しました。

以上のことを踏まえ実装すると以下の様になります。

N=int(input())
S=list(map(int,input().split()))
T=list(map(int,input().split()))
T1=min(T)
k=T.index(T1)
ans=[0]*N
time=0
count=0

while(N>count):
    if k==N:
        k=0
    if T[k]<time or count==0:
        time=T[k]
    ans[k]=time
    time=time+S[k]
    k+=1
    count+=1
for p in range(N):
    print(ans[p])
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0