问题描述
思路
难点在于居民连续经过k个及以上高风险区域才算逗留
设立一个数组用于记录连续经过出现在高风险地区的最大次数
int counter = 0; //临时计数器
int consec[n] = {0}; //记录居民连续出现在高风险地区的最大次数
一旦该居民位置不在高风险区域内,则将临时计数器counter
的值置为0,表示连续中断,需要重新计数。同时每次对比counter
的值,若大于原本的最大连续次数,则令最大连续次数=counter,即consec[i] = counter
if( resident[j][0]>=xl && resident[j][0]<=xr && resident[j][1]>=yd && resident[j][1]<=yu)
{
counter++;
if( counter > consec[i])
consec[i] = counter;
}
else
counter = 0;
最后对最大连续次数进行判断,判断是否经过或逗留
for( int i = 0; i < n; i++)
{
if( consec[i] >= 1)
pass++;
if( consec[i] >= k)
stay++;
}
完整代码
#include<iostream>
using namespace std;
int main()
{
int n, k, t, xl, yd, xr, yu;
cin >> n >> k >> t >> xl >> yd >> xr >> yu;
int resident[t][2]; //记录一位居民的位置记录
int counter = 0; //临时记录该居民在高风险地区出现次数
int consec[n] = {0}; //记录居民连续出现在高风险地区的最大次数
int pass = 0; //经过人数
int stay = 0; //逗留人数
for( int i = 0; i < n; i++)
{
counter = 0;
for( int j = 0; j < t; j++)
{
cin >> resident[j][0] >> resident[j][1];
if( resident[j][0]>=xl && resident[j][0]<=xr && resident[j][1]>=yd && resident[j][1]<=yu)
{
counter++;
if( counter > consec[i])
consec[i] = counter;
}
else
counter = 0;
}
}
for( int i = 0; i < n; i++)
{
if( consec[i] >= 1)
pass++;
if( consec[i] >= k)
stay++;
}
cout << pass << endl;
cout << stay << endl;
return 0;
}