问题描述
试题编号: | 202009-2 |
试题名称: | 风险人群筛查 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 题目背景某地疫情爆发后,出于“应检尽检”的原则,我们想要通知所有近期经过该高危区域的居民参与核酸检测。 问题描述想要找出经过高危区域的居民,分析位置记录是一种简单有效的方法。 具体来说,一位居民的位置记录包含 𝑡 个平面坐标 (𝑥1,𝑦1),(𝑥2,𝑦2),⋯,(𝑥𝑡,𝑦𝑡),其中 (𝑥𝑖,𝑦𝑖) 表示该居民 𝑖 时刻所在位置。 考虑某位居民的位置记录,如果其中某个坐标位于矩形内(含边界),则说明该居民经过高危区域;进一步地,如果其中连续 𝑘 个或更多坐标均位于矩形内(含边界),则认为该居民曾在高危区域逗留。需要注意的是,判定经过和逗留时我们只关心位置记录中的 𝑡 个坐标,而无需考虑该居民在 𝑖 到 𝑖+1 时刻之间位于何处。 给定高危区域的范围和 𝑛 位居民过去 𝑡 个时刻的位置记录,试统计其中经过高危区域的人数和曾在高危区域逗留的人数。 输入格式输入共 𝑛+1 行。 第一行包含用空格分隔的七个整数 𝑛、𝑘、𝑡、𝑥𝑙、𝑦𝑑、𝑥𝑟 和 𝑦𝑢,含义如上文所述。 接下来 𝑛 行,每行包含用空格分隔的 2𝑡 个整数,按顺序表示一位居民过去 𝑡 个时刻的位置记录 (𝑥1,𝑦1),(𝑥2,𝑦2),⋯,(𝑥𝑡,𝑦𝑡)。 输出格式输出共两行,每行一个整数,分别表示经过高危区域的人数和曾在高危区域逗留的人数。 样例输入1 Data 样例输出1 Data 样例1说明如下图红色标记所示,前三条位置记录经过了高危区域; 样例输入2 Data 样例输出2 Data 样例2说明该位置记录经过了高危区域,但最多只有连续两个时刻位于其中,不满足逗留条件。 评测用例规模与约定全部的测试点满足 1≤𝑛≤20,1≤𝑘≤𝑡≤103,所有坐标均为整数且绝对值不超过 106。 |
本题逻辑还是很清晰的
/*
1.输入n位居民
连续 k 个
t个时间
范围(两对确定的矩形)(左下xl,yd右上xr,yu)
n行,每行t对(位置记录)
2.n1表示经过
n2表示逗留
3.遍历n,检查t对,对n1,n2标记
4.输出n1
n2
*/
一步一步写就行了
#include<bits/stdc++.h>
using namespace std;
int check(int x,int y,int x1,int y1,int x2,int y2){
if((x1<=x&&x2>=x)&&(y1<=y&&y2>=y)){
return 1;//表示在高危范围内
}
return 0;
}
int findmax(const vector<int>& nums) {
int maxCount = 0, currentCount = 0;
for (int num : nums) {
if (num == 1) {
currentCount++; // 如果当前元素是1,增加当前计数
} else {
maxCount = max(maxCount, currentCount); // 遇到0,更新最大计数
currentCount = 0; // 重置当前计数
}
}
maxCount = max(maxCount, currentCount); // 检查数组末尾的连续1
return maxCount;
}
int main(){
int n,k,t;cin>>n>>k>>t;
int x1,y1,x2,y2;//左下 右上
cin>>x1>>y1>>x2>>y2;
int n1=0,n2=0;//经过,逗留
for(int i=0;i<n;i++){
vector<int>x(t),y(t);
vector<int>u(t);//记录点的情况
for(int j=0;j<t;j++){
cin>>x[j]>>y[j];
if(check(x[j],y[j],x1,y1,x2,y2)){
u[j]=1;
}
else{
u[j]=0;
}
}
if(findmax(u)){
n1++;
}
if(findmax(u)>=k){
n2++;
}
}
cout<<n1<<endl;
cout<<n2<<endl;
}
这里的findmax由于懒所以直接问了问chatgpt(