CSP_202009-2_风险人群筛查

问题描述

在这里插入图片描述
在这里插入图片描述

思路

难点在于居民连续经过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;
}

提交截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值