问题描述
试题编号: | 202009-2 |
试题名称: | 风险人群筛查 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 题目背景某地疫情爆发后,出于“应检尽检”的原则,我们想要通知所有近期经过该高危区域的居民参与核酸检测。 问题描述想要找出经过高危区域的居民,分析位置记录是一种简单有效的方法。 具体来说,一位居民的位置记录包含 t 个平面坐标 (x1,y1),(x2,y2),⋯,(xt,yt),其中 (xi,yi) 表示该居民 i 时刻所在位置。 考虑某位居民的位置记录,如果其中某个坐标位于矩形内(含边界),则说明该居民经过高危区域;进一步地,如果其中连续 k 个或更多坐标均位于矩形内(含边界),则认为该居民曾在高危区域逗留。需要注意的是,判定经过和逗留时我们只关心位置记录中的 t 个坐标,而无需考虑该居民在 i 到 i+1 时刻之间位于何处。 给定高危区域的范围和 n 位居民过去 t 个时刻的位置记录,试统计其中经过高危区域的人数和曾在高危区域逗留的人数。 输入格式输入共 n+1 行。 第一行包含用空格分隔的七个整数 n、k、t、xl、yd、xr 和 yu,含义如上文所述。 接下来 n 行,每行包含用空格分隔的 2t 个整数,按顺序表示一位居民过去 t 个时刻的位置记录 (x1,y1),(x2,y2),⋯,(xt,yt)。 输出格式输出共两行,每行一个整数,分别表示经过高危区域的人数和曾在高危区域逗留的人数。 样例输入1 Data 样例输出1 Data 样例1说明如下图红色标记所示,前三条位置记录经过了高危区域;
样例输入2 Data 样例输出2 Data 样例2说明该位置记录经过了高危区域,但最多只有连续两个时刻位于其中,不满足逗留条件。 评测用例规模与约定全部的测试点满足 1≤n≤20,1≤k≤t≤103,所有坐标均为整数且绝对值不超过 106。 |
题解
在循环里针对情况计数
# 风险人群筛查
if __name__ == '__main__':
n, k, t, xl, yd, xr, yu = map(int, input().split())
# 是否在高危区域
def in_area(x, y):
return xl <= x <= xr and yd <= y <= yu
# 输入
peoples = []
for i in range(n):
p = list(map(int, input().split()))
peoples.append([[p[i], p[i + 1]] for i in range(0, len(p), 2)])
pass_by_all = 0
stay_all = 0
for positions in peoples:
counter = 0
pass_by = False
stay = False
# 检查行踪
for x, y in positions:
if in_area(x, y):
pass_by = True
counter += 1
if counter >= k:
stay = True
break
else:
counter = 0
if pass_by:
pass_by_all += 1
if stay:
stay_all += 1
print(pass_by_all)
print(stay_all)