A25669. 浇花系统
题目描述
浇花系统
题目描述
有n棵植物,排成一排,从左到右的编号分别为:1,2,3,......,n ;n颗植物所需的水量分别为:w1,w2,w3,......wn 。小丁为植物设计了一套浇水系统。
浇水系统:每次会将连续的L棵植物分别浇1份水。每棵植物可以被重复浇水,如果当前植物已经满足所需水量,系统会将多浇的水排到水池中。
请计算浇水系统最少要浇多少次才能满足所有植物所需水量,以及排到水池的水量。
例如:n=4,L=3;4棵植物所需要的水量分别为1、1、3、2,浇水系统每次会将连续的 3 棵植物分别浇上1份水。以下是浇水次数最少的一种方式:
• 第一次:将第1、2、3 棵植物分别浇上1份水,浇水后4棵植物所需水量为0、0、2、2;
• 第二次:将第 2、3、4 棵植物分别浇上1份水,浇水后4棵植物所需水量为0、0、1、1,由于第2棵植物已经满足所需水量,所以系统会将此次多余的1份水排到水池;
• 第三次:将第 2、3、4棵植物分别浇上1份水,浇水后4棵植物所需水 量为0、0、0、0,此次系统也会将第2棵植物多余的1份水排到水池;所以,浇水系统最少需要浇3次,并且将多余的2份水排到水池。
输入描述
第一行输入两个整数n、L(1 ≤ L ≤ n ≤ 1000),分别表示植物的数量和浇水系统每次连续浇灌的植物数量,整数之间以一个空格隔开。
第二行输入n个整数w(0 <= w; <= 1000) ,分别表示编号 1~n 的植物所需的水量,整数之间以一个空格隔开。
输出描述
输出两个整数,分别表示浇水系统最少的浇水次数,以及排到水池的水量,整数之间以一个空格隔开。
样例输入
4 3
1 1 3 2样例输出
3 2参考答案
n, L = map(int,input().split())
plants = list(map(int,input().split()))
times = 0
water = 0
i = 0
for i in range(n - L + 1):# 前n-L个植物浇水
if plants[i] > 0:
time = plants[i]# 将浇水量设为当前植物需水量
for j in range(i, i + L):# 往后取L个浇水
plants[j]-= time # 浇水
if plants[j] < 0:# 如果小于0,代表需要排水
water -= plants[j]
plants[j] = 0
times += time
if max(plants[-L:]) > 0:# 后面L个存在需要水的植物
time = max(plants[-L:])# 直接浇最多需水量的水
for j in range(L):
plants[j - L] -= time
if plants[j - L] < 0:
water -= plants[j - L]
times += time
print(times, water)答案解析
使用循环遍历所需水量列表,如果当前需水量plants[i]大于0,则将浇水次数设为plants[i],从当前植物往后取三个植物,均浇水plants[i],也就是都减少plants[i]。如果浇水后小于0,则将计入排水量。
后面L个需要单独运算,如果后面L个所需水量存在大于0的情况,则将浇水量设为三个中需水量最大的值,并完成浇水,排水量计算。