CSP-202209-3-防疫大数据

CSP-202209-3-防疫大数据

解题思路

一、数据结构定义

  • 对于大模拟的题,合适的数据结构选择十分重要,正确的数据结构选择能够有效的提升解题效率
// 漫游消息结构体
struct RoamingData {
    int date, user, region; 
};

vector<RoamingData> roamingMessages[1010]; // 存储漫游消息
map<int, pair<int, int>> riskRegionDuration; // 每个地区的风险区持续时间
map<int, bool> isRiskRegion; // 每个地区是否曾被设为风险区

1.map简介

map 是 C++ 标准库中的关联容器,实现了一个有序的键-值映射。每个元素都是一个包含键和值的键值对。以下是一些关键特性:

  • 有序性map 中的元素是按照键的大小进行排序的,默认是升序

  • 唯一键:每个键在 map 中是唯一的,因此每个键只能对应一个值。如果插入重复键,新值会替代旧值

  • 查找效率map 提供了高效的查找操作,其底层实现通常是红黑树,保证了对数时间复杂度的查找操作。

用法示例:
#include <map>
#include <iostream>

int main() {
    // 创建一个map,键是字符串,值是整数
    std::map<std::string, int> myMap;

    // 插入键值对
    myMap["apple"] = 5;
    myMap["banana"] = 3;
    myMap["orange"] = 7;

    // 访问值
    std::cout << "Number of apples: " << myMap["apple"] << std::endl;

    // 遍历map
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

2.pair简介

pair 是 C++ 标准库中的一个模板类,用于表示一个有序的、固定大小的元组(tuple)包含两个元素。它提供了一种方便的方法来组合两个值,通常用于需要同时返回两个值或将两个值关联的场景

  1. 成员变量

    • first:第一个元素。
    • second:第二个元素。
  2. 等号重载

    • pair& operator=(const pair& p);:允许将一个 pair 赋值给另一个。
  3. 使用示例

#include <utility>
#include <iostream>

int main() {
    // 创建一个pair,包含一个字符串和一个整数
    std::pair<std::string, int> myPair = std::make_pair("apple", 5);

    // 访问pair的成员
    std::cout << "Fruit: " << myPair.first << ", Count: " << myPair.second << std::endl;

    // 使用括号初始化列表创建pair
    std::pair<int, double> anotherPair = {42, 3.14};
    
    return 0;
}

二、风险区设置

  • 函数 setRiskRegion 的目的是将指定的地区标记为风险区,并更新该地区的风险区持续时间。下面是该函数的详细逻辑解释:
void setRiskRegion(int region, int date) {
    // 如果地区不是风险区
    if (!isRiskRegion[region]) {
        // 将该地区标记为风险区,设置风险区持续时间为 [date, date + 6]
        riskRegionDuration[region] = { date, date + 6 };
    } else {
        // 如果地区已经是风险区
        if (date <= riskRegionDuration[region].second + 1) {
            // 如果新日期与在原来风险区的有效日期内,直接延长有效期
            riskRegionDuration[region].second = date + 6;
        } else {
            // 否则,重新设置风险区持续时间为 [date, date + 6]
            riskRegionDuration[region] = { date, date + 6 };
        }
    }
    // 标记该地区为风险区
    isRiskRegion[region] = true;
}

这样,setRiskRegion 函数通过更新 riskRegionDurationisRiskRegion 这两个数据结构,有效地管理每个地区的风险区状态和持续时间。

三、检查漫游消息是否满足条件

函数 check 的目的是检查给定的漫游消息是否满足一定条件,即该消息是否在风险区域内。

bool check(int messageDate, int user, int region, int currentDate) {
    // 检查该地区是否是风险区,以及消息日期是否在指定范围内
    if (isRiskRegion[region] && 
        messageDate >= currentDate - 6 && messageDate <= currentDate && 
        messageDate >= riskRegionDuration[region].first && currentDate <= riskRegionDuration[region].second)
        return true;
    return false;
}
  1. 检查风险区:首先,检查指定的地区是否被标记为风险区(通过 isRiskRegion 的映射)。

  2. 检查消息日期范围:接着,检查消息的日期是否满足以下条件(否则必然是无效日期,因为风险地区的有效期已经结束):

    • messageDate >= currentDate - 6:消息日期在当前日期的前 6 天之后。
    • messageDate <= currentDate:消息日期在当前日期之前。
  3. 检查风险区域的日期范围:最后,检查消息日期是否在该地区的风险区域持续时间范围内,即:

    • messageDate >= riskRegionDuration[region].first:消息日期在风险区域开始日期之后。
    • currentDate <= riskRegionDuration[region].second:当前日期在风险区域结束日期之前。

如果所有条件都满足,则返回 true,表示该漫游消息在风险区域内;否则,返回 false

完整代码

  • 注意:只需遍历过去七天的漫游消息而不需要遍历全部消息,否则会时间超限。
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <algorithm>

using namespace std;

// 漫游消息结构体
struct RoamingData {
    int date, user, region; 
};

vector<RoamingData> roamingMessages[1010]; // 存储漫游消息
map<int, pair<int, int>> riskRegionDuration; // 每个地区的风险区持续时间
map<int, bool> isRiskRegion; // 每个地区是否曾被设为风险区

// 设置地区为风险区
void setRiskRegion(int region, int date) {
    if (!isRiskRegion[region])
        riskRegionDuration[region] = { date, date + 6 };
    else {
        if (date <= riskRegionDuration[region].second + 1)
            riskRegionDuration[region].second = date + 6; // 可以连起来
        else
            riskRegionDuration[region] = { date, date + 6 };
    }
    isRiskRegion[region] = true;
}

// 检查漫游消息是否满足条件
bool check(int messageDate, int user, int region, int currentDate) {
    if (isRiskRegion[region] && 
        messageDate >= currentDate - 6 && messageDate <= currentDate && 
        messageDate >= riskRegionDuration[region].first && currentDate <= riskRegionDuration[region].second)
        return true;
    return false;
}

int main() {
    int days;
    cin >> days;

    for (int currentDay = 0; currentDay < days; currentDay++) { // currentDay表示当前日期
        int riskRegions, roamingMessagesCount;
        cin >> riskRegions >> roamingMessagesCount;

        for (int i = 1; i <= riskRegions; i++) { // 读入风险区并更新
            int region;
            cin >> region;
            setRiskRegion(region, currentDay);
        }

        for (int i = 1; i <= roamingMessagesCount; i++) { // 读入漫游消息并存入
            int date, user, region;
            cin >> date >> user >> region;
            if (date <= currentDay)
                roamingMessages[currentDay].push_back({ date, user, region });
        }

        set<int> riskUserList; // 当天的风险名单

        // 遍历过去七天的漫游消息
        for (int i = (currentDay - 6 >= 0 ? currentDay - 6 : 0); i <= currentDay; i++) {
            // 对于每一天的漫游消息列表
            for (int j = 0; j < roamingMessages[i].size(); j++) {
                // 检查漫游消息是否满足条件
                if (check(roamingMessages[i][j].date, roamingMessages[i][j].user, roamingMessages[i][j].region, currentDay))
                    // 如果满足条件,将用户添加到风险用户列表
                    riskUserList.insert(roamingMessages[i][j].user);
            }
        }


        cout << currentDay << " ";
        for (const auto& ii : riskUserList) {
            cout << ii << " ";
        }
        cout << endl;
    }

    return 0;
}

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#与VisionPro联合开发——TCP/IP通信

TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是一组用于在网络上进行通信的通信协议。它是互联网和许多局域网的基础&#xff0c;为计算机之间的数据传输提供了可靠性、有序性和错误检测。在软件开发中&#xff0c;TCP/IP 通信通常用于实现网络应用程序之间的数据交…

YOLOv5算法进阶改进(17)— 添加BiFormer注意力机制 | 提升小目标检测精度

前言:Hello大家好,我是小哥谈。本文主要通过对YOLOv5模型添加Bifommer注意力机制为例,让大家对于YOLOv5模型添加注意力机制有一个深入的理解,通过本文你不仅能够学会添加Biformer注意力机制,同时可以举一反三学会其他的注意力机制的添加。🌈 前期回顾: YOLOv5算法进…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(八)NodeJS入门——http模块

一念心清净&#xff0c;处处莲花开。 055_http模块_网页资源加载基本过程 哈喽&#xff0c;大家好&#xff0c;这一课节我们来介绍一下网页资源加载的基本过程。首先先强调一点&#xff0c;这个内容对于我们后续学习非常非常的关键&#xff0c;所以大家务必要将其掌握。 首先先…

hbuilderx创建、运行uni-app

创建uni-app 在点击工具栏里的文件 -> 新建 -> 项目&#xff1a; 选择uni-app类型&#xff0c;输入工程名&#xff0c;选择模板&#xff0c;点击创建&#xff0c;即可成功创建。 uni-app自带的模板有 Hello uni-app &#xff0c;是官方的组件和API示例。还有一个重要模…

人人都是项目管理者,项目管理的基础入门

一、教程描述 本套教程旨在系统介绍项目管理的方法论&#xff0c;帮助大家认识、熟悉、体验、思考项目管理&#xff0c;全面掌握项目管理的流程与方法&#xff0c;快速成长为时代紧缺型的项目管理人才。本套项目管理入门教程&#xff0c;大小805.40M&#xff0c;共有13个文件。…

智慧农业—农业资源数据中心

综述 农业资源数据中心建设的目标是将大量的农业生产信息通过采集、清洗、核准后实现统一存储、统一管理,实现数据的共享和集中管理,保障数据的安全,也为数据的挖掘分析提供决策分析创造条件。 农业资源数据中心的数据架构如下图所示: (1)农业专家数据库。主要收录国内、…

三步实现SpringBoot全局日志记录,整合Echarts实现数据大屏

&#x1f680; 注重版权&#xff0c;转载请注明原作者和原文链接 小袁博客&#xff1a;https://boke.open-yuan.com/小袁博客后台&#xff1a;https://boke.open-yuan.com/back-manager/更多项目内容关注小红书&#x1f50d;OpenYuan开袁 http://xhslink.com/I9zNaC有需求可以在…

vue 手势解锁功能

效果 实现 <script setup lang"ts"> const canvasRef ref<HTMLCanvasElement>() const ctx ref<CanvasRenderingContext2D | null>(null) const width px2px(600) const height px2px(700) const radius ref(px2px(50))const init () > …

【AI链接】 大模型语言模型网站链接

目录 GPT类1. chatgpt2. GROP3. Google AI Studio4. Moonshot AI (国内) 解读论文类&#xff1a;1. txyz 编程辅助插件&#xff1a;1. Fitten Code GPT类 1. chatgpt https://chat.openai.com/ 2. GROP https://groq.com/ 3. Google AI Studio https://aistudio.google…

计算机网络:思科实验【3-集线器与交换机的区别、交换机的自学习算法】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容集线器与交换机的区别交换机的自学习算法…

南京观海微电子----Verilog基础(一)——数据类型、运算符

1. 数据类型 1.1 常量 整数&#xff1a;整数可以用二进制b或B&#xff0c;八进制o或O&#xff0c;十进制d或D&#xff0c;十六进制h或H表示&#xff0c;例如&#xff0c;8’b00001111表示8位位宽的二进制整数&#xff0c;4’ha表示4位位宽的十六进制整数。 X和Z&#xff1a;X…

Github 2024-02-21 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-21统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目8非开发语言项目1TypeScript项目1 gpt4free 语言模型集合改进计划 创建周期&#xff1a;300 天开…

Excel的中高级用法

单元格格式&#xff0c;根据数值的正负分配不同的颜色和↑ ↓ 根据数值正负分配颜色 2-7 [蓝色]#,##0;[红色]-#,##0 分配颜色的基础上&#xff0c;根据正负加↑和↓ 2↑-7↓ 其实就是在上面颜色的代码基础上加个 向上的符号↑&#xff0c;或向下的符号↓ [蓝色]#,##0↑;[红色…

vivo 基于 StarRocks 构建实时大数据分析平台,为业务搭建数据桥梁

在大数据时代&#xff0c;数据分析和处理能力对于企业的决策和发展至关重要。 vivo 作为一家全球移动互联网智能终端公司&#xff0c;需要基于移动终端的制造、物流、销售等各个方面的数据进行分析以满足业务决策。 而随着公司数字化服务的演进&#xff0c;业务诉求和技术架构有…

动态规划课堂1-----斐波那契数列模型

目录 动态规划的概念&#xff1a; 动态规划的解法流程&#xff1a; 题目: 第 N 个泰波那契数 解法&#xff08;动态规划&#xff09; 代码&#xff1a; 优化&#xff1a; 题目&#xff1a;最小花费爬楼梯 解法&#xff08;动态规划&#xff09; 解法1&#xff1a; 解…

【QT 5 +Linux下软件生成+qt软件生成使用工具+学习他人文章+第一篇:使用linuxdeployqt软件生成】

【QT 5 Linux下软件生成qt软件生成使用工具学习他人文章第一篇&#xff1a;使用linuxdeployqt软件生成】 1、前言2、实验环境3、自我学习总结-本篇总结1、新手的疑问&#xff0c;做这件事的目的2、了解工具&#xff1a;linuxdeployqt工具3、解决相关使用过程中问题 4、参照文章…

5分钟轻松帮你EasyRecovery恢复女朋友照片

相信有不少男性电脑玩家都会将女朋友的照片存放在电脑硬盘之内&#xff0c;作为珍贵的收藏和回忆。但是在某些时候&#xff0c;如果我们错误地删除了这些照片&#xff0c;或者由于系统问题导致其中的照片丢失&#xff0c;那么我们怎么找回女朋友的照片&#xff1f;这个问题就足…

进程的学习

进程基本概念: 1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xf…

微芒计划-简洁方便的效率待办管理工具【免费】

&#x1f632;微芒计划-简洁方便的效率待办管理工具【免费】 下载地址 &#x1f4dd;我的待办 快速添加待办任务&#xff0c;快速查看任务进度&#xff0c;摘要等。新增标签&#xff0c;分类&#xff0c;更好管理待办任务。 ☀️OKR目标管理 OKR让抽象的企业战略明确为上下对…

✅技术社区项目—Session/Cookie身份验证识别

session实现原理 SpringBoot提供了一套非常简单的session机制&#xff0c;那么它又是怎么工作的呢? 特别是它是怎么识别用户身份的呢? session又是存在什么地方的呢? 核心工作原理 借助cookie中的 JESSIONID 来作为用户身份标识&#xff0c;这个数据相同的&#xff0c;认…