问题描述
代码思路
我们可以使用一个循环来读入每位居民的行动轨迹。对于一位居民,我们可以设一个计数器来记录他在指定区域内停留的次数和停留的最长时间。然后在每次读入坐标时,判断该坐标是否在指定区域内。如果是,则将计数器加1,并更新它的最长停留时间。如果不是,则重置计数器为0,因为要统计最长停留时间
。最后统计有多少位居民经过了指定区域(即停留次数大于0),以及停留时间超过给定时长k的居民数量。
代码实现
#include<iostream>
using namespace std;
int main()
{
int n, k, t, xl, yd, xr, yu;
int x, y;
int stay = 0; // 当前在区域内的停留时间
int stay_max = 0; // 在区域内的最长停留时间
int stay_sum = 0; // 停留时间超过k的居民数量
int pass_sum = 0; // 经过指定区域的居民数量
cin >> n >> k >> t >> xl >> yd >> xr >> yu;
while (n--)
{
stay = 0;
stay_max = 0;
for (int i = 0; i < t; i++)
{
cin >> x >> y;
if (x >= xl && x <= xr && y >= yd && y <= yu) // 判断当前坐标是否在指定区域内
{
stay++; // 更新当前居民在区域内的停留时间
stay_max = max(stay_max, stay); // 更新居民在区域内的最长停留时间
}
else
stay = 0; // 重置停留时间为0
}
if (stay_max > 0)
pass_sum++;
if (stay_max >= k)
stay_sum++;
}
cout << pass_sum << endl;
cout << stay_sum;
return 0;
}