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;// 遍历mapfor (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;// 使用括号初始化列表创建pairstd::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; // 可以连起来elseriskRegionDuration[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;
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编反外挂

在软件保护领域&#xff0c;尤其是游戏保护中&#xff0c;反外挂是一个重要的议题。外挂通常指的是一种第三方软件&#xff0c;它可以修改游戏数据、操作游戏内存或提供其他作弊功能&#xff0c;从而给玩家带来不公平的优势。为了打击外挂&#xff0c;游戏开发者会采取一系列措…

web安全学习笔记【16】——信息打点(6)

信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等[1] #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-C…

代码随想录算法训练营第二十四天补|● 回溯理论基础 ● 77. 组合

回溯理论基础、组合问题 回溯理论基础 回溯能解决的问题 回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案 回溯如何穷举&#xff1a; 横向遍历for循环&#xff0c;纵向遍历backtracking&#xff08;递归&#xff09;&#xff0c;一般来说&#…

pikachu靶场-RCE

介绍&#xff1a; RCE(remote command/code execute)概述 RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 远程系统命令执行 一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命…

【数据结构】排序

目录 1.排序的概念及其应用 1.1排序的概念 1.2排序的应用 1.3常见的排序算法 2.常见排序算法的实现 2.1插入排序的实现 2.11基本思想 2.12直接插入排序 2.2希尔排序&#xff08;缩小增量排序&#xff09; 2.21基本思想 2.22希尔排序 2.3选择排序 2.31基本思想 2.3…

蓝桥杯《数字三角形》

题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外&…

JavaScript 进阶02

深入对象 构造函数 构造函数是用于创建对象的函数。 <script> //构造函数 构造函数的首字母大写 function Obj(name,age,aaa){this.namenamethis.ageage } //调用函数 const obj1new Obj("小明",4) console.log(obj1) </script> 使用 new 关键字调用…

Java之线程同步、synchronized用法及原理

线程的同步 场景1&#xff1a;两个线程同时访问一个变量&#xff0c;一个线程自增&#xff0c;一个线程自减 public class thread11 {public static void main(String[] args) throws InterruptedException {Thread thread1 new AddThread();Thread thread2 new DecThread(…

如何开发通过蓝牙技术实现灯光智能调节的小程序

近年来&#xff0c;随着智能家居市场日渐兴起&#xff0c;人们对于家居生活品质的需求不断提升。在这一背景下&#xff0c;蓝牙智能调节小程序的开发能够为客户提供更便捷、智能化的LED灯光调节方案。需求方想要实现通过蓝牙开发实现LED灯光亮度和颜色的智能调节&#xff0c;同…

DAY29--learning English

一、积累 1.sign up for 2.business trip 3.calendar 4.acne 5.band-aid 6.scar 7.prescription 8.pimple 9.saucy 10.slurp 11.germaphobe 12.shred 13.boggle 14.platser 15.lick 16.sling 17.smack 18.stereotype 19.salmon 20.cable 二、练习 1.牛津原译 calendar. /ˈk…

Windows中的Git Bash运行conda命令:未找到命令的错误(已解决)

在windows中的Gitbash中 打开激活conda环境&#xff0c;并运行&#xff08;前提是你先安装好git&#xff08;自己去官网下载&#xff09;&#xff09;。 要能够在Gitbash上运行Conda&#xff0c; 临时配置 如果你只是临时用一下&#xff0c;就是临时爽一把&#xff0c;那就按…

线程池(ThreadPoolExecutor,as_completed)和scrapy框架初步构建——学习笔记

用法1&#xff1a;map函数 with ThreadPoolExecutor() as pool: results pool.map(craw,utls)for result in results:print(result) 1.Scrapy框架&#xff1a; 五大结构&#xff1a;引擎&#xff0c;下载器&#xff0c;爬虫&#xff0c;调度器&#xff0c;管道&#x…

【vue】provide/inject

provide/ inject这对选项需要一起使用&#xff0c;以允许一个祖先组件向其所有子孙后代注入一个依赖&#xff0c;不论组件层次有多深&#xff0c;并在起上下游关系成立的时间里始终生效。 通途点来讲可以用来实现隔代传值&#xff0c;传统的props只能父传子&#xff0c;而 prov…

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt&#xff08;官方发音 [kju:t]&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序 Qt 是纯 C 开发的&#xff0c;正常情况下需要先学习C语言、然后在学习C然后才能使用…

Linux--shell编程中内部表和外部表之间的转换

内部表和外部表之间的转换 1、查询表的类型 desc formatted student; Table Type: MANAGED_TABLE 2、修改内部表student为外部表 alter table student set tblproperties(EXTERNALTRUE); 3、查询表的类型 desc formatted student; Table Type: EXT…

神经网络系列---归一化

文章目录 归一化批量归一化预测阶段 测试阶段γ和β&#xff08;注意&#xff09;举例 层归一化前向传播反向传播 归一化 批量归一化 &#xff08;Batch Normalization&#xff09;在训练过程中的数学公式可以概括如下&#xff1a; 给定一个小批量数据 B { x 1 , x 2 , … …

《隐私计算简易速速上手小册》第8章:隐私计算对机器学习和 AI 的影响(2024 最新版)

文章目录 8.1 机器学习中的隐私问题8.1.1 基础知识8.1.2 主要案例:使用差分隐私的机器学习8.1.3 拓展案例 1:基于隐私的数据聚合8.1.4 拓展案例 2:保护隐私的推荐系统8.2 使用隐私计算加强 AI 安全8.2.1 基础知识8.2.2 主要案例:使用同态加密的数据分析8.2.3 拓展案例 1:安…

134 Linux 系统编程11 ,readlink命令,文件目录rwx权限差异,目录操作函数

一 readlink 命令 前面知道&#xff0c;如果a.soft是一个软链接&#xff0c;我们使用 cat a.soft,会直接查看这个软链接指向的文件 那么我们就是想看这个软链接是啥&#xff0c;可以使用 readlink a.soft 二 获取工作目录 getcwd函数 获取进程当前工作目录 (卷3&#xff0c;标…

camunda源代码编译运行(一):下载编译camunda源代码

使用camunda开源工作流引擎有多种方式&#xff0c;包括&#xff1a;通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式&#xff0c;其中&#xff0c;通过源代码编译集成整合方式&#xff0c;是最复杂的一种方式&#xff0c;文本重点介绍如…

ES坑-创建索引使用_下划线-黑马旅游搜不到

学ES的时候&#xff0c;星级过滤无效 找不到数据。 需要 但是我们在创建的时候使用的是keyword 通过研究发现&#xff0c;我们导入数据的时候应该默认的为starName 我get库时候发现有2个字段 所以通过star_name搜索因为都是空数据搜不到&#xff0c;而starName类型为text所以…