1654領域クリップ
9107 ワード
質問する
家で暇つぶしをしていたオ·ヨンシクは、朴成元(パク·ソンウォン)の呼び出しを受け、急いで駆けつけた.朴成元. キャンプの時は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本のローカルネットワーク線を生成できる最大長出力はセンチメートル単位の整数である.
バイナリナビゲーションを使用しないでタイムアウトしたコード
K, N = map(int,input().split())
lines = [int(input()) for _ in range(K)]
lines.sort()
maxv = 0
for i in range(max(lines),0,-1): #자르는 길이: 457부터 1씩 감소됨
# print(i)
count = 0
for j in lines: #갖고 있는 랜선
cut_line = j//i #2
count+=cut_line
if count < N:
continue
else:
maxv=max(maxv,i)
print(maxv)
バイナリ・ナビゲーションを使用するコード
import sys
sys.setrecursionlimit(1000001)
K, N = map(int,input().split())
lines = [int(input()) for _ in range(K)]
lines.sort()
maxLength = 0
def bs(target,start,end):
global maxLength
count = 0
mid = (start+end)//2
if start>end:
return None
for i in lines:
count+=i//mid
if count>=target:
maxLength = max(maxLength,mid)
return bs(target,mid+1,end)
elif count<target:
return bs(target,start,mid-1)
result = bs(N,1,max(lines))
print(maxLength)
注意:
エラー:
感じ:
Reference
この問題について(1654領域クリップ), 我々は、より多くの情報をここで見つけました https://velog.io/@a87380/1654번-랜선-자르기-파이썬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol