网站备案 登陆,cms自助建站,饮水机企业网站模板,基础微网站开发动态一、题目 题目描述#xff1a; 在做物理实验时#xff0c;为了计算物体移动的速率#xff0c;通过相机等工具周期性的采样物体移动能离。由于工具故障#xff0c;采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值#xff0c;不同工具的故意模式存在…一、题目 题目描述 在做物理实验时为了计算物体移动的速率通过相机等工具周期性的采样物体移动能离。由于工具故障采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值不同工具的故意模式存在差异算法的各关门限会根据工具类型做相应的调整请实现一个算法计算出给定一组采样值中正常值的最长连续周期。 判断第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取值范围为[0100000]从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) # 用于标记采样数据的列表初始值都为0for 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] 0else:items[i] 1i 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] 1error_num, corrent, j 0, 0, iwhile m 0 and j len(s_list):if items[j] 0:error_num 1if error_num t:corrent j - 1 if j 0 else 0j 1if 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] 1breakelif i m len(s_list):# 如果错误数据的范围在m之内则将其修正为前一个正确数据for k in range(i, len(s_list)):if k corrent 1:items[k] 1else:items[k] 0else:# 如果错误数据的范围超过m则将范围内的数据修正为前一个正确数据for k in range(i, i m):if k corrent 1:items[k] 1else:items[k] 0if i m p len(s_list) 1:# 如果错误数据的范围超过列表末尾则将列表末尾的数据之后的所有数据标记为错误数据for k in range(i, len(s_list)):items[k] 0else:items[k], i 0, k pelse:i 1res, location 0, 0
for item in range(len(items)):if items[item] ! 1:if location res:res locationlocation 0else:location 1print(max(res, location)) # 输出最长连续周期