[BOJ/Python]1092号船


この問題は、クレーンの重量制限と箱の重量を降順に並べ替え、最前面からクレーンと箱を検査し、重い箱から重い箱までのクレーンを手配し、クレーンに箱を持ち上げるたびに時間を増やすことで解決される.
  • nと入力します.
  • クレーンの重量制限を受けるクレーンの配列を発表し、入力を受け入れる.
  • mと入力します.
  • 箱の重さを発表し、入力を受けた箱が並ぶ.
  • クレーンと箱体を降順に並べます.
  • が移動する箱の数を計算する変数cntを0と定義する.
  • ボックス移動時間を格納する変数時間を0と定義する.
  • ボックスの移動を表示するm個のFalseからなる配列chkを定義する.
  • ボックスのインデックスを容易に使用するために、n個の0からなる配列tmpが定義されている.
  • クレーン[0]がbox[0]より小さい場合、-1を出力してプログラムを終了する.
  • cntがboxアレイの長さより小さい場合、ドアを回転させる.
    ->n対iを繰り返すfor文.
    -->tmp[i]box配列の長さ未満でwhile文をループします.
    ----->chk[tmp[i]がfalseであり、クレーン[i]がbox[tmp[i]以上である場合(現在のボックスが移動せず、現在のクレーンに移動可能である場合)
    ------>chk[tmp[i]がTrueに更新され、tmp[i]が1増加し、cntが1増加し、while文が閉じられます.
    -->tmp[i]を1つ増やします.
    ->時間が1つ増える.
  • 出力
  • 時間.
  • Code

    n=int(input())
    crane=list(map(int, input().split()))
    m=int(input())
    box=list(map(int, input().split()))
    crane.sort(reverse=True)
    box.sort(reverse=True)
    cnt=0
    time=0
    chk=[False]*m
    tmp=[0]*n
    if crane[0]<box[0]:
        print(-1)
        quit()
    while cnt<len(box):
        for i in range(n):
            while tmp[i]<len(box):
                if chk[tmp[i]]==False and crane[i]>=box[tmp[i]]:
                    chk[tmp[i]]=True
                    tmp[i]+=1
                    cnt+=1
                    break
                tmp[i]+=1
        time+=1
    print(time)