【华为机试】2023年真题B卷(python)-采样过滤

一、题目

题目描述:

在做物理实验时,为了计算物体移动的速率,通过相机等工具周期性的采样物体移动能离。由于工具故障,采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值,不同工具的故意模式存在差异,算法的各关门限会根据工具类型做相应的调整,请实现一个算法,计算出给定一组采样值中正常值的最长连续周期。
判断第1个周期的采样数据s0是否正确的规则如下(假定物体移动速率不超过10个单元前一个采样周期S[i-1]):
S[i]<=0,即为错误值
S[i] 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))  # 输出最长连续周期

你可能感兴趣的:(华为机试,华为,python,算法,华为机试,采样过滤)