难度指数:⭐⭐⭐⭐⭐
【满分】【华为OD机试真题2023B卷 JAVA&JS】数据最节约的备份方法
知识点:二分法
算法参考:
华为od统一考试B卷【数据最节约的备份方法】Python 实现
import functools
import sys
from collections import Counter, defaultdict
import copy
from itertools import permutations
import re
import math
import sys
from queue import Queue
files = [int(x) for x in input().split(",")]
files .sort()
left = 0
right = len(files ) + 1
while left < right:
mid = (left + right) // 2
totals = [500] * mid
flag = True
for i in range(len(files )-1, -1, -1):
fileSize = files [i]
totals.sort()
if totals[mid-1] >= fileSize:
totals[mid-1] -= fileSize
else:
flag = False
break
if flag:
right = mid
else:
left = mid + 1
print(left)
Mine:
idea
下边界不应该为0
代码实现
def min_discs0(discs):
left = (sum(discs) + 499) // 500
right = len(discs) + 1
totall = [500 - discs[-i-1] for i in range(left)]
while left < right:
flag = True
mid = (left + right) // 2
total = totall + [500 for _ in range(mid - len(totall))]
j = 0
for i in range(len(discs) - len(totall) -1, -1, -1):
d = discs[i]
total.sort()
if total[-1] >= d:
total[-1] -= d
else:
flag = False
break
if flag:
right = mid
else:
left = mid + 1
return left
耗时对比:
import random
from time import time
def min_discs(files):
left = 0
right = len(files ) + 1
while left < right:
mid = (left + right) // 2
totals = [500] * mid
flag = True
for i in range(len(files)-1, -1, -1):
fileSize = files[i]
totals.sort()
if totals[mid-1] >= fileSize:
totals[mid-1] -= fileSize
else:
flag = False
break
if flag:
right = mid
else:
left = mid + 1
return left
def min_discs0(discs):
left = (sum(discs) + 499) // 500
right = len(discs) + 1
totall = [500 - discs[-i-1] for i in range(left)]
while left < right:
flag = True
mid = (left + right) // 2
total = totall + [500 for _ in range(mid - len(totall))]
j = 0
for i in range(len(discs) - len(totall) -1, -1, -1):
d = discs[i]
total.sort()
if total[-1] >= d:
total[-1] -= d
else:
flag = False
break
if flag:
right = mid
else:
left = mid + 1
return left
T = 10
while T:
discs = [random.randint(1,500) for _ in range(random.randint(1,100))] # list(map(int, input().split(',')))
discs.sort()
t1 = time()
num = min_discs(discs)
t2 = time()
num0 = min_discs0(discs)
t3 = time()
print(num, num0)
print(t2 - t1, t3 - t2)
T -= 1