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样例输出1样例1说明如下图红色标记所示,前三条位置记录经过了高危区域; 样例输入2样例输出2样例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;
}
本文来自博客园,作者:永恒&,转载请注明原文链接:https://www.cnblogs.com/Sun-yuan/p/14456002.html

浙公网安备 33010602011771号