📅  最后修改于: 2023-12-03 15:12:12.392000             🧑  作者: Mango
本题主要考察搜索算法的应用。给定一个病人的病历,其中包含若干个体征的数值和医疗记录,以及一个开始和结束的时间,需要在这个时间段内给该病人注射麻醉药物。假设病历中记录了每种药物的使用时间和剂量,其中有一种药物是麻醉注射剂,需要找到这种药物的剂量,并在规定时间内给病人注射。
输入文件中有若干个测试用例。每个测试用例的第一行为两个整数 n
和 m
,分别表示记录的总数和需要查找的时间范围。其中 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)$。具体的常数因素与实现方式有关。在一般情况下,线性查找的常数因素比二分查找大,因此可能存在一定的效率差距。