食堂供餐python

通用一般算法

华为OD机试 Python 【食堂供餐】

def get_minimum_speed(dining_duration, prepared_meals, incoming_people):
    low_bound, high_bound = 0, max(incoming_people)
    optimal_speed = 0

    while low_bound <= high_bound:
        possible_speed = (low_bound + high_bound) // 2
        
        if can_serve_all(prepared_meals, possible_speed, incoming_people):
            optimal_speed = possible_speed
            high_bound = possible_speed - 1
        else:
            low_bound = possible_speed + 1

    return optimal_speed

def can_serve_all(initial_meals, added_meals, people_per_time):
    remaining_meals = initial_meals - people_per_time[0]

    for i in range(1, len(people_per_time)):
        remaining_meals += added_meals
        if remaining_meals >= people_per_time[i]:
            remaining_meals -= people_per_time[i]
        else:
            return False

    return True

if __name__ == '__main__':
    dining_duration = int(input())
    prepared_meals = int(input())
    incoming_people = list(map(int, input().split()))

    print(get_minimum_speed(dining_duration, prepared_meals, incoming_people))

创新算法

主要思想

        假设所有单位时间里准备的餐量不多不少,得到各单位时间之前所产的盒饭总数。整除时间,得到单位时间应当产的盒饭数,取最大值。

算法实现

def get_minimum_speed0(N, M, P):
    m=0
    M=-M+P[0]
    for i in range(1,N):
        M=M+P[i]
        temp=M/i
        temp=math.ceil(temp)
        m=max(m,temp)
    return m

生成测试用例

    dining_duration = int(random.randint(1,1000))
    prepared_meals = int(random.randint(0,1000))
    incoming_people = [random.randint(0,prepared_meals+1)]+[random.randint(0,100) for i in range(0,dining_duration)]

算法对比

    print(get_minimum_speed(dining_duration, prepared_meals, incoming_people))
    print(get_minimum_speed0(dining_duration, prepared_meals, incoming_people))

完整代码

import random,math
def get_minimum_speed(dining_duration, prepared_meals, incoming_people):

    low_bound, high_bound = 0, max(incoming_people)
    optimal_speed = 0

    while low_bound <= high_bound:
        possible_speed = (low_bound + high_bound) // 2
        
        if can_serve_all(prepared_meals, possible_speed, incoming_people):
            optimal_speed = possible_speed
            high_bound = possible_speed - 1
        else:
            low_bound = possible_speed + 1

    return optimal_speed

def can_serve_all(initial_meals, added_meals, people_per_time):
    remaining_meals = initial_meals - people_per_time[0]

    for i in range(1, len(people_per_time)):
        remaining_meals += added_meals
        if remaining_meals >= people_per_time[i]:
            remaining_meals -= people_per_time[i]
        else:
            return False

    return True

def get_minimum_speed0(N, M, P):
    m=0
    M=-M+P[0]
    for i in range(1,N):
        M=M+P[i]
        temp=M/i
        temp=math.ceil(temp)
        m=max(m,temp)
    return m

if __name__ == '__main__':
    '''dining_duration = int(input())
    prepared_meals = int(input())
    incoming_people = list(map(int, input().split()))'''
    dining_duration = int(random.randint(1,1000))
    prepared_meals = int(random.randint(0,1000))
    incoming_people = [random.randint(0,prepared_meals+1)]+[random.randint(0,100) for i in range(0,dining_duration)]

    print(dining_duration,'\n',prepared_meals)
    #print(' '.join(str(i) for i in incoming_people))
    print(get_minimum_speed(dining_duration, prepared_meals, incoming_people))
    print(get_minimum_speed0(dining_duration, prepared_meals, incoming_people))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值