数据最节约的备份方法python

 难度指数:⭐⭐⭐⭐⭐

【满分】【华为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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值