2020-9-2 风险人群筛查
作者:互联网
问题描述
试题编号: | 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。 |
#include<stdio.h> #include<string.h> using namespace std; struct point//点 { int a,b;//点的横纵坐标 int across;//是否经过,初始为0 }p[1010]; int main () { int n,k,t,x1,y1,x2,y2; int count=0; int s=0,ac=0; int flag=0,flag2=0; scanf("%d%d%d%d%d%d%d",&n,&k,&t,&x1,&y1,&x2,&y2); for(int i = 0; i < n; i++)//n个人 { flag=0; flag2=0; count=0; memset(p,0,sizeof(p[0])*1010);//因为第一个人用的是P的前t个空间,第二个人也要用同一个空间,所以必须清空前t个空间 for(int j=0;j<t;j++) { scanf("%d%d",&p[j].a,&p[j].b); if(p[j].a >= x1 && p[j].a <= x2 && p[j].b >= y1 && p[j].b <= y2) { p[j].across = 1;//第i个人,在第j个点处,经过 flag = 1;//只要有一个经过,就把flag值为1 } } if(flag==1)//经过 { ac++; } for(int j=0;j<t;j++)//遍历第i个人的t个点 { if(p[j].across==1)//连续k个经过点,逗留 { count++; if(count>=k) { flag2=1; break; } } else { count = 0; } } if(flag2 == 1) { s++; } } printf("%d\n%d",ac,s); return 0; }
标签:20,人群,60,int,2020,筛查,100,高危,80 来源: https://www.cnblogs.com/Sun-yuan/p/14456002.html