LoginSignup
0
0

More than 1 year has passed since last update.

ABC214 C - Distribution から学んだ

Posted at

abc214c_1.png
abc214c_2.png
abc214c_3.png
abc214c_4.png
abc214c_5.png

だいぶ悩んだ。

アプローチ1

No1 すぬけさんからスタートする場合、
No2 ,T[2] から宝石を受け取って、 3, 4, ,5 ,6 ... N,1 と No1 すぬけさんに戻るまでの時間
No3 ,T[3] から宝石を受け取って、 4, ,5 ,6 ... N,1 と No1 すぬけさんに戻るまでの時間


の中から最小の時間を求める。

アプローチ2

No1 が終わったら No2 を基準に start し、アプローチ1 と同じことをやる。
。。多分、for 分は N だけだと足りない。2*N は必要だと気付く。

よし、行ける!!っと思い、思惑通りに書いたつもりだったが、
WA となって、全くそうなってないことに気付く。

abc214c_ng.py
N = int(input())
S = list(map(int,input().split()))
T = list(map(int,input().split()))
lis = [[T[i]] for i in range(N)]

for i in range(1,2*N):
    if i>1:
        lis[i%N].append(lis[(i-1)%N][0] + S[(i-1)%N])#アプローチ
    lis[i%N].append(lis[(i-1)%N][-1] + S[(i-1)%N])   #アプローチ

for i in range(N):
    print(min(lis[i]))

リスト内のデータが増えていき、どれとどれを使って
演算しなければならないかゴチャゴチャになったために
サンプルが通っただけで、出来たと思い込んでしまった。それが敗因。

アプローチ3

例えば、すぬけさんを通過する度に最小となる時間を選択することができれば、
シンプルで分かり易いのではないだろうか?
っと考えて以下を書いたら通った。

abc214c_ok.py
N = int(input())
S = list(map(int,input().split()))
T = list(map(int,input().split()))

lis = [0]*N
lis[0] = T[0]
for i in range(1,2*N):
    lis[i%N] = min(T[i%N],lis[(i-1)%N]+S[(i-1)%N])

for i in range(N):
    print(lis[i])

なかなか勉強させてもらった。

0
0
0

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