题目描述:
在做物理实验时,为了计算物体移动的速率,通过相机等工具周期性的采样物体移动能离。由于工具故障,采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值,不同工具的故意模式存在差异,算法的各关门限会根据工具类型做相应的调整,请实现一个算法,计算出给定一组采样值中正常值的最长连续周期。
判断第1个周期的采样数据s0是否正确的规则如下(假定物体移动速率不超过10个单元前一个采样周期S[i-1]):
S[i]<=0,即为错误值
S[i]<S[i-1],即为错误值
S[i]-S[i-1]>=10,即为错误值·其它情况为正常值
判断工具是否故障的规则如下:
在M个周期内,采样数据为错误值的次数为T(次数可以不连续),则工具故障
判断故障恢复的条件如下:
产生故障后的P个周期内,采样数据一直为正常值,则故障恢复
错误采样数据的处理方式
检测到故障后,丢弃从故障开始到故障恢复的采样数据,在检测到工具故障之前,错误的采样数据,则由最近一个正常值代替;如果前面没有正常的采样值,则丢弃此采样数据
给定一段周期的采样数据列表S,计算正常值的最长连续周期。
输入描述:?
故障确认周期数和故障次数门限分别为M和T,故障恢复周期数为P。第i个周期,检测点的状态为S[i]
输入为两行,格式如下:
M T P
s1 s2 s3 ...?
M、t 和 e的取值范围为[1100000]?
s1取值范围为[0,100000],从0开始编号
输出描述:
输出一行,输出正常值的最长连续周期
示例:
输入:
10 6 3
-1 1 2 3 100 10 13 9 10
输出:
8
# -*- coding: utf-8 -*-
'''
@File : 2023-B-采样过滤.py
@Time : 2023/12/23 22:20:50
@Author : mgc
@Version : 1.0
@Desc : None
'''
m, t, p = list(map(int, input().split()))
s_list = list(map(int, input().split()))
items = [0] * len(s_list) # 用于标记采样数据的列表,初始值都为0
for i in range(len(s_list)):
# 检查采样数据是否符合要求
if s_list[i] <= 0 or (i > 0 and (s_list[i] - s_list[i - 1] >= 10 or s_list[i] < s_list[i - 1])):
items[i] = 0
else:
items[i] = 1
i = 0
while i < len(s_list):
if items[i] == 0 and i > 0 and items[i - 1] == 1:
# 如果当前数据错误且前一个数据正确,则将当前数据修正为前一个数据
s_list[i] = s_list[i - 1]
items[i] = 1
error_num, corrent, j = 0, 0, i
while m > 0 and j < len(s_list):
if items[j] == 0:
error_num += 1
if error_num >= t:
corrent = j - 1 if j > 0 else 0
j += 1
if error_num >= t:
if i + t == len(s_list) - 1:
# 如果错误数据的范围正好到达列表末尾,则将其修正为前一个正确数据
for k in range(i, corrent + 1):
s_list[k] = s_list[i - 1] if i > 0 else s_list[0]
items[k] = 1
break
elif i + m <= len(s_list):
# 如果错误数据的范围在m之内,则将其修正为前一个正确数据
for k in range(i, len(s_list)):
if k < corrent + 1:
items[k] = 1
else:
items[k] = 0
else:
# 如果错误数据的范围超过m,则将范围内的数据修正为前一个正确数据
for k in range(i, i + m):
if k < corrent + 1:
items[k] = 1
else:
items[k] = 0
if i + m + p >= len(s_list) + 1:
# 如果错误数据的范围超过列表末尾,则将列表末尾的数据之后的所有数据标记为错误数据
for k in range(i, len(s_list)):
items[k] = 0
else:
items[k], i = 0, k + p
else:
i += 1
res, location = 0, 0
for item in range(len(items)):
if items[item] != 1:
if location > res:
res = location
location = 0
else:
location += 1
print(max(res, location)) # 输出最长连续周期