📜  谜题 5 | (寻找麻醉注射剂)(1)

📅  最后修改于: 2023-12-03 15:12:12.392000             🧑  作者: Mango

谜题 5 | (寻找麻醉注射剂)

本题主要考察搜索算法的应用。给定一个病人的病历,其中包含若干个体征的数值和医疗记录,以及一个开始和结束的时间,需要在这个时间段内给该病人注射麻醉药物。假设病历中记录了每种药物的使用时间和剂量,其中有一种药物是麻醉注射剂,需要找到这种药物的剂量,并在规定时间内给病人注射。

输入格式

输入文件中有若干个测试用例。每个测试用例的第一行为两个整数 nm,分别表示记录的总数和需要查找的时间范围。其中 n 的取值范围为 $0 \leq n \leq 10^5$,m 的取值范围为 $0 \leq m \leq 1440$。接下来的 n 行中,每行为一个记录,记录中包含四个数据分别为时间点 time (一个整数,表示距离开始时间的分钟数)、药品种类 type (一个字符串,表示药品种类)、药品剂量 x (一个实数,表示药品剂量)、体征数值 y(一个实数,表示体征数值)。其中 type 有若干个取值,其中包括一种称为“麻醉注射剂”的药品,在每个测试用例中只出现一次。最后一行为一个整数 $t$,表示注射药品的时间点。

输出格式

输出文件中包含若干个测试用例的结果。每个测试用例的输出仅包含一行,表示需要注射的药品剂量,保留两位小数。

输入样例
2 50
20 C 10.5 36.8
30 B 7.2 36.2
40
4 80
0 C 10.5 36.8
20 B 7.2 37.6
40 C 9.1 38.2
60 A 6.2 37.7
70
0 0
输出样例
10.50
9.10
解题思路

本题中需要找到一种称之为“麻醉注射剂”的药品,可以使用常规的线性查找或者二分查找。具体代码实现可以参考下面的样例代码。

from typing import List, Dict, Any

def find_anesthetic(records: List[Dict[str, Any]], start_time: int, end_time: int) -> float:
    for r in records:
        if r['type'] == '麻醉注射剂' and start_time <= r['time'] <= end_time:
            return r['x']
    return 0.0

if __name__ == '__main__':
    while True:
        nm = input().split()
        if not nm:
            break
        n, m = map(int, nm)
        records = []
        for i in range(n):
            time, type, x, y = input().split()
            records.append({'time': int(time), 'type': type, 'x': float(x), 'y': float(y)})
        t = int(input())
        print('{:.2f}'.format(find_anesthetic(records, t-m, t))))
时间复杂度

本题中的查找操作需要遍历全部 n 条记录,时间复杂度为 $O(n)$。具体的常数因素与实现方式有关。在一般情况下,线性查找的常数因素比二分查找大,因此可能存在一定的效率差距。