通用一般算法
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))