思路:主要思路就是要遍历每个点,判断其是否在风险区内,另外注意如果是逗留则必须要连续多点才可以,不能累加
1.首先,从输入中读取 n、k、t、x1、y1、x2、y2 等变量的值。这些变量表示了一些区域的坐标范围以及相关参数。
2.接下来,使用两个数组 A 和 flag 来存储计数和标记信息。数组 A 用于记录每个人在给定的时间段内待在区域内的次数,数组 flag 用于标记满足连续逗留条件的人。
3.接着,使用两层嵌套的循环,外层循环遍历每个人,内层循环遍历每个人在时间段内的位置。
4.在内层循环中,通过 fun 函数判断当前位置是否在给定的区域范围内。如果不在范围内,将计数器 cnt 重置为 0,表示逗留被打断。如果在范围内,将计数器 cnt 加 1,并更新数组 A、flag 的值。
5.循环结束后,通过两个变量 sum1 和 sum2 来统计满足条件的人数。sum1 统计当过至少一次范围内的人数(数组 A 中大于 0 的元素个数),sum2 统计满足连续逗留条件的人数(数组 flag 中值为 1 的元素个数)。
6.最后,输出 sum1 和 sum2 的值,表示满足条件的人数。
#include<iostream>
using namespace std;
int n,k,t,x1,y1,x2,y2;
int A[22];
int flag[22];
int fun(int temp1,int temp2){
if(temp1<=x2&&temp1>=x1){
if(temp2<=y2&&temp2>=y1){
return 1;
}
}
return 0;
}
int main(){
cin>>n>>k>>t>>x1>>y1>>x2>>y2;
for(int i=0;i<n;i++){
int cnt=0; //注意要是看逗留需要连续在,那么在这个人除用一个变量来计数, 开始变量为0,只要在范围内,变量就加1,如果不在范围内变量就变为0,但是要注意,要先判断在不在,不在就先变为0
for(int j=0;j<t;j++){
int temp1,temp2;
cin>>temp1>>temp2;
if(fun(temp1,temp2)==0){
cnt=0;
}
else if(fun(temp1,temp2)==1){
A[i]++;
cnt++;
if(cnt>=k){
flag[i]=1;
}
}
}
}
int sum1=0;//在这里除了会覆盖,不然都要加初值
int sum2=0;
for(int i=0;i<n;i++){
if(A[i]>0){
sum1++;
}
if(flag[i]==1){
sum2++;
}
}
cout<<sum1<<endl;
cout<<sum2;
return 0;
}