1654-ローカルエリアネットワークのクリップ


質問する
家で暇つぶしをしていたオ·ヨンシクは、朴成元(パク·ソンウォン)の呼び出しを受け、急いで駆けつけた.朴成元はキャンプの時に使うN本のネットラインを作ろうとしたが、忙しくて英植に助けを求めた.
呉英植はすでに自分のK本の網線を持っている.しかし、K個のローカルエリアネットワークの長さはそれぞれ異なる.パク・ソンウォンは、網を全部N本の同じ長さの網にしようとしたので、K本の網を切る.例えば、300センチの網から140センチの網を2本切り取ったら、20センチを捨てるべきだ.(切り取ったケーブルは貼り付けられません.)
便宜上、ローカルエリアネットワークをクリップまたは作成する際に失われた長さがないと仮定し、既存のK本のローカルエリアネットワーク線を使用してN本のローカルエリアネットワーク線を作成できない場合もない.また,トリミング時には常にセンチメートル単位,整数長単位で行うと仮定した.N個よりも多く作られていてN個も含まれています.このとき作成できる最大長線長を求めるプログラムを作成します.
入力
第1行目は、呉英植がすでに保有している網線の個数Kと、必要な網線の個数Nとを入力する.Kは1以上10000以下の整数、Nは1以上100000以下の整数である.そして常にK≦Nである.次に、K行に、既に所有している各ローカルネットワーク線の長さをセンチメートル単位の整数として入力します.ローカルエリアネットワークの長さは231-1の自然数以下である.
しゅつりょく
1行目にN本のローカルネットワーク線を生成できる最大長出力はセンチメートル単位の整数である.
私のコード[多くの失敗作...]
import sys

K, N = map(int, sys.stdin.readline().split())
LAN = [ int(sys.stdin.readline()) for i in range(K) ]
l = 10000

def CountLAN(length):
    return sum([ L // length for L in LAN])

while True:
    Count = CountLAN(l)
    if Count < N:
        l //= 2
    elif Count > N:
        l += l//2
    else:
        while CountLAN(l) == N:
            l += 1

        print("Result =", l-1)
        exit(0)
:タイムアウト
import sys

K, N = map(int, sys.stdin.readline().split())
LAN = [ int(sys.stdin.readline()) for i in range(K) ]
Start, End = 1, max(LAN)

def CountLAN(length):
    return sum([ L // length for L in LAN])

while Start <= End:
    mid = (Start + End) // 2
    if CountLAN(mid) >= N:
        Start += 1
    else:
        End -= 1

print(End)
:タイムアウト
import sys

K, N = map(int, sys.stdin.readline().split())
LAN = [ int(sys.stdin.readline()) for i in range(K) ]
Start, End = 1, max(LAN)

def CountLAN(length):
    return sum([ L // length for L in LAN])

while Start <= End:
    mid = (Start + End) // 2
    if CountLAN(mid) >= N:
        Start = mid + 1
    else:
        End = mid - 1

print(End)
成功しました!(本当は他の人のコードを参考にしてみたのですが…ううう)