题目
题目可以在CSP官网中查看哟!
算法分析
这道题难度不是很大,算是一个较为简单的小模拟题吧。题目大致意思就是:有一个疫情高危区域,输入n个人的t个移动位置坐标,判断这个人会不会出现在高危区域,如果出现并连续在高危区域出现了超过k个时刻,则判定这个人经过高危区域,并停留了;如果这个人只是出现在高危区域,但并没有连续出现k个区域,则判定这个人只是经过了高危区域。
我们只需要遍历n个人,再依次遍历每一个人的t个时刻的位置,用一个计数器时刻记录这个人连续出现在高危区域的时刻数,依据这个计数器,即可实现对这个人的判定。代码如下。
完整代码
#include<iostream>
#include<cstdio>
#include<vector>
#pragma warning (disable:4996)
using namespace std;
int n, k, t, xl, yd, xr, yu;
struct Person
{
vector<int> x;
vector<int> y;
}person[100];
int main()
{
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
int i, j;
cin >> n >> k >> t >> xl >> yd >> xr >> yu; //输入
for (i = 1; i <= n; i++)
{
for (j = 1; j <= t; j++) //输入一个人的t个时刻的坐标
{
int x, y;
cin >> x >> y;
person[i].x.push_back(x);
person[i].y.push_back(y);
}
}
int num_through = 0; //记录经过高危区域的人数
int num_stay = 0; //记录经在高危区域停留的人数
for (i = 1; i <= n; i++)
{
int flag_through = 0;
int flag_stay = 0;
int num_continue = 0; //记录该人连续出现在高危区域的时刻数
for (j = 0; j < t; j++)
{
//判断是否出现在高危区域
if (person[i].x[j] >= xl && person[i].x[j] <= xr && person[i].y[j] >= yd && person[i].y[j] <= yu)
num_continue++;
else
num_continue = 0;
if (num_continue > 0) flag_through = 1;
if (num_continue >= k) flag_stay = 1;
}
if (flag_through == 1 && flag_stay == 1)
{
num_stay++;
num_through++;
}
else if (flag_through == 1 && flag_stay == 0) num_through++;
}
cout << num_through << endl;
cout << num_stay;
return 0;
}