[BOJ/Python]14493号フルーツ


今回の問題は、所要時間を累積し、現在の待ち時間内に、その区間のA+Bを残りのBで割ってBに等しい場合、次の区間に移動し、所要時間の積算を解くことによって解決することである.
最初は待ち時間を累計して1回増やしたが、正解はあったものの、性能は芳しくなかった.
  • nと入力します.
  • 区間で、AとBの情報を保存するbot配列が発表された.
  • は、現在の所要時間を表す変数curを0として定義する.
  • 0からnまで繰り返されるiに対してfor文を行う.
    ->aとbを入力し、aとbを含む配列をbot配列に入れます.
  • 第1セグメントはBを待たなければならないので、curにbot[0][1]、すなわちB[0]を加える.
  • while文は、区間を表す変数iを1として定義する.(最初のセグメントに入った)
  • iがnより小さい場合、ドアを回転させる.
    ->所要時間の経過を表すためにcurに1を加える.(次の区間に移動するには1秒、移動しなくても1秒)
    ->cur%(bot[i][0]+bot[i][1])がbot[i][1]以上であれば、次の区間に移動できるため、i 1を増やす.
  • 出力
  • cur+1.
  • n=int(input())
    bot=[]
    cur=0
    for i in range(n):
        a, b=map(int, input().split())
        bot.append([a, b])
    cur+=bot[0][1]
    i=1
    while i<n:
        cur+=1
        if cur%(bot[i][0]+bot[i][1])>=bot[i][1]:
            i+=1
    print(cur+1)
    正解処理は行われていますが、4836 msが必要です.削減できる方法を考えて、次の段階に進めない場合は、所要時間内に所要時間を追加することを実施する.
  • nと入力します.
  • 区間で、AとBの情報を保存するbot配列が発表された.
  • は、現在の所要時間を表す変数curを0として定義する.
  • 0からnまで繰り返されるiに対してfor文を行う.
    ->aとbを入力し、aとbを含む配列をbot配列に入れます.
  • 第1セグメントはBを待たなければならないので、curにbot[0][1]、すなわちB[0]を加える.
  • while文は、区間を表す変数iを1として定義する.(最初のセグメントに入った)
  • iがnより小さい場合、ドアを回転させる.
    ->所要時間の経過を表すためにcurに1を加える.(次の区間に移動するには1秒、移動しなくても1秒)
    ->cur%(bot[i][0]+bot[i][1])がbot[i][1]以上であれば、次の区間に移動できるため、i 1を増やす.
    ->そうでなければ、curにbot[i][1]-cur%(bot[i][0]+bot[i][1])-1を加える.最後に1を減算したのは、次の反復で1を加算するためです.
  • 出力
  • cur+1.
  • Code

    n=int(input())
    bot=[]
    cur=0
    for i in range(n):
        a, b=map(int, input().split())
        bot.append([a, b])
    cur+=bot[0][1]
    i=1
    while i<n:
        cur+=1
        if cur%(bot[i][0]+bot[i][1])>=bot[i][1]:
            i+=1
        else:
            cur+=(bot[i][1]-cur%(bot[i][0]+bot[i][1])-1)
    print(cur+1)

    時間が2208ミリ秒と半分以上減ったことが確認できた.