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


作成日:2022年1月14日午後5:27

インプリメンテーションコード

# 랜선 자르기 (결정 알고리즘)
import sys
sys.stdin = open("input.txt", "rt")
k, n = map(int, input().split())
l = [int(input()) for _ in range(k)]
l.sort()
a = sum(l) // n
res = 0

while True:
    for x in l:
        res += x//a
    if res < n:
        a -= 1
        res = 0
    else:
        break

print(a)

模範解答

# 랜선 자르기
import sys
#sys.stdin = open("input.txt", "rt")

def Count(len):
    cnt = 0
    for x in l:
        cnt += x//len
    return cnt

k, n = map(int, input().split())
l = []
largest = 0
for _ in range(k):
    tmp = int(input())
    l.append(tmp)
    largest = max(largest, tmp) # 가장 큰 수 찾기

lt = 1
rt = largest

while lt <= rt:
    mid = (lt+rt)//2
    if Count(mid) >= n:
        res = mid
        lt = mid + 1
    else:
        rt = mid - 1
print(res)

差異

  • 私が実現したコードは、入力データが多い(kが大きい)場合に実行時間が長くなります.
  • とは逆に,模範解答では2元探索を利用して範囲を半分に絞り込んで探索するので効率的である.
  • .txtファイルから数値をロードしてリストに入れ、最適な答えのように最大の数値を検索するためにソートします.txtファイルから重複文にロードする過程で、最大値を更新して検索することが有効です.