问题描述
一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间的距离是100m。每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,未照明区间的长度和。
输入描述:
第一行为一个数N,表示灯的个数,[1, 100000]
第二行为N个空格分隔的数,表示路灯的照明半径,[1, 100*100000]
输出描述:
第一个路灯和最后一个路灯之间,未照明区间的长度和
举例:
输入:
8
10 10 10 10 10 10 10 10
输出:
560
输入:
8
10 10 10 250 10 10 10 10
输出:
160
分析:
把首尾路灯之间的公路具体化为(N-1)*100段的列表S,初始全为0,表示未被照明。然后遍历每个路灯,将路灯能照到的范围内的0置位1,最后统计S中0的数量。
用例代码(Python3)
N = 8
r = [10, 10, 10, 10, 10, 10, 10, 10]
# N = int(input())
# r = list(map(int, input().split()))
S = [0 for _ in range((N-1) * 100)] # 首尾路灯之间的距离列表空间S,初始全赋值为0,表示每段都没有被照明
for i in range(N):
if i * 100 - r[i] < 0: # 灯光覆盖了左端,S中置换的位置也只能从第0位开始
left = 0
else:
left = i * 100 - r[i]
if i * 100 + r[i] > (N-1) * 100: # 灯光覆盖了右端,S中置换的位置也只能到第最后一位
right = (N - 1) * 100
else:
right = i * 100 + r[i]
S[left:right] = [1] * (right - left) # 灯光覆盖区域全标记为1
print(S.count(0)) # 统计没有被灯光覆盖区域
代码优化(Python3)
N = int(input())
r = list(map(int, input().split()))
d = 100 # 路灯之间的距离均为100
S = [0 for _ in range((N-1) * d)] # 首尾路灯之间的距离空间,初始全赋值为0:表示没有被照明
for i in range(N):
left = max(0, i * d - r[i])
right = min((N-1) * d, i * d + r[i])
S[left:right] = [1] * (right - left) # 灯光覆盖区域全标记为1
print(S.count(0)) # 统计没有被灯光覆盖区域