【CSP】2022-03-3 计算资源调度器 stl大模拟使用map优化索引 完整思路+完整的写代码过程(遇到的问题)+完整代码

2022-03-3 计算资源调度器 stl大模拟使用map优化索引

  • 2022-03-3 计算资源调度器 stl大模拟使用map优化索引
    • 思路
    • 写代码的过程(遇到的问题)
    • 完整代码

2022-03-3 计算资源调度器 stl大模拟使用map优化索引

在联系了之前那么多道stl大模拟题后,终于能够独自在一定的时间内完成第三题了,不过这题算是比较简单的,因为我是倒着练习的,先练习的是最新的题目,但是csp的趋势是,前2题越来越简单,然后第三题越来越难,所以我做的这题算是在第三题中比较简单的。

在这里插入图片描述

从开始看题到100分

但是不管难度如何第三题的思路都是使用STL中的数据结构,并且没有什么算法的,然后就是注意一些细节问题就可以拿到满分,所以不要觉得第三题很难。

一是有信心,二是能想到对应的数据结构,三是能够注意细节。这样拿下第三题就不在话下(当然我还没有拿下)

思路

这题的思路之前的题目都是大差不差的,看似题目的背景有些差别,但是思路非常相似。

首先题目有四个数据类型

一是可用区:可用区可以包含多个计算节点,每个可用区有唯一的编号

二是计算节点:计算节点是包含在可用区里的,每个计算节点含有多个应用

三是应用:就是包含在计算节点中的,每个计算任务都要有一个应用执行

四是计算任务:计算任务可以有一些需求来限制要放在哪个可用区,哪个计算节点上的。

然后每个我们就可以使用map来建立映射关系(本质上是建立索引方便搜索的)

最后任务就是为任务搜索出符合限制条件的计算节点,然后输出就好了。

写代码的过程(遇到的问题)

首先做第三题最好不要一口吃一个胖子,就是一步一步的写,一个一个测试点的过,这样找错误比较容易。如果全部写完然后再找错误很容易会被混淆,很难定位错误在哪里。

  1. 首先不考虑限制条件(对应测试点1,2,3,4)

主要就是排序问题 按着题目给的排序要求来写,选出来最合适的计算节点然后更新

这里我写完了还是0分

在这里插入图片描述

然后发现最后选出来了最适合的节点,但是没有更新它,让其包含这个计算任务

然后就20分了

在这里插入图片描述

  1. 然后考虑有可用区亲和性的限制(对应测试点 5,6,7,8,9,10)

这里写好了代码,但是还是20分

在这里插入图片描述

然后检查错误,发现是没有判断特殊情况,如果可用区没有节点可分配的情况下就输出0

            if (na != 0) // 如果有可用区亲和性{alloc = part[na].nodein;alloc_part.insert(na);if (alloc.empty()){cout << 0 << ' ';continue;}have_app = part[na].app_to_node[paa];}

之后就50分了

在这里插入图片描述

  1. 然后写有节点反亲和性限制的代码(对应测试点11,12,13,14,15,16)

这个比较麻烦,写的时候发现代码结构有问题重构了结构(就是if else的结构),发现还是50分

在这里插入图片描述

然后发现代码有漏洞,就是如果根据这个反亲和性搜索出来的节点的集合是空的,那么如果是强制必须满足的话就要输出0然后跳出本次循环,但是如果不是强制满足的话,就不用这个条件删除,还用原来的。

这里我只判断了不是空的情况下,和是空并且强制满足的情况

if (!temp.empty())alloc = temp;
else if (temp.empty() && paa == 1) // 如果要强制满足 但是又为空
{cout << 0 << ' ';continue;
}

这点看了我好久,很不容易发现,写代码不够规范,思路不够清晰导致的。

然后改成这样就好了

                if (temp.empty() && paa == 1) // 如果要强制满足 但是又为空{cout << 0 << ' ';continue;}if (!temp.empty())alloc = temp;

然后还是50分,然后自己编了数据也没发现问题,后来就重新读题,发现原来是判断paar是不是必须满足,我笔误了一下,就找了很久的bug

将paa改成了paar

if (temp.empty() && paa == 1) 

改成了

if (temp.empty() && paar == 1) 

然后就80分了,拼写错误真的很坑啊,很浪费时间啊,以后写if条件的时候要多想一下

在这里插入图片描述

  1. 增加应用亲和性的限制

这个限制,一开始读题没发现后来才发现是同一个区内要有相同的应用,而不是同一个计算节点上

然后这次写的比较顺利,把前面所有的问题都注意到了

一下就100分了

在这里插入图片描述

完整代码

#include <bits/stdc++.h>
using namespace std;
int n, m;
// 计算节点
struct compute_node
{int id;int l;           // 位于编号为l的可用区中vector<int> app; // 节点中的计算应用
} node[1001];
// 计算区/可用区
struct compute_part
{int id;                                   // 编号unordered_set<int> nodein;                // 计算节点map<int, unordered_set<int>> app_to_node; // 通过app的编号id找到计算节点的集合
} part[1001];
unordered_map<int, unordered_set<int>> app_to_allnode; /// 如果没有节点亲和性 从全局里面找应用亲和性
unordered_map<int, unordered_set<int>> app_to_part;    //
unordered_set<int> all_compute_node;
bool cmp(struct compute_node a, struct compute_node b)
{if (a.app.size() == b.app.size()){return a.id < b.id;}return a.app.size() < b.app.size();
}int main()
{// freopen("1.txt", "r", stdin);cin >> n >> m;for (int i = 1; i <= n; i++){cin >> node[i].l;node[i].id = i;part[node[i].l].nodein.insert(i);all_compute_node.insert(i);}int g;cin >> g;for (int i = 1; i <= g; i++){int f, a, na, pa, paa, paar;cin >> f >> a >> na >> pa >> paa >> paar;for (int j = 1; j <= f; j++){unordered_set<int> alloc;      // 分配的节点unordered_set<int> alloc_part; // 分配的区的编号unordered_set<int> have_app;   // 包含paa这个应用的节点if (na != 0)                   // 如果有可用区亲和性{alloc = part[na].nodein;alloc_part.insert(na);if (alloc.empty()){cout << 0 << ' ';continue;}have_app = part[na].app_to_node[paa];}else // 如果没有可用区亲和性{alloc = all_compute_node;have_app = app_to_allnode[paa];}if (pa != 0) // 如果有应用亲和性 得在同一个区才行{unordered_set<int> hava_app_part = app_to_part[pa]; // 包含pa的可用区的集合if (hava_app_part.empty()){cout << 0 << ' ';continue;}if (!alloc_part.empty()) // 说明有可用区亲和性{for (auto item : alloc_part){if (hava_app_part.count(item) == 0)alloc_part.erase(item);}if (alloc_part.empty()){cout << 0 << ' ';continue;}}else // 说明没有可用区亲和性{alloc_part = hava_app_part;have_app.clear();alloc.clear();for (auto item : alloc_part){alloc.insert(part[item].nodein.begin(), part[item].nodein.end());have_app.insert(part[item].app_to_node[paa].begin(), part[item].app_to_node[paa].end());}}}if (paa != 0) // 如果应用反亲和性{unordered_set<int> temp = alloc;for (auto item : have_app){temp.erase(item);}if (temp.empty() && paar == 1) // 如果要强制满足 但是又为空{cout << 0 << ' ';continue;}if (!temp.empty())alloc = temp;}struct compute_node min_node;min_node.id = 0;for (auto item : alloc){if (min_node.id == 0 || cmp(node[item], min_node)){min_node = node[item];}}node[min_node.id].app.push_back(a);app_to_allnode[a].insert(min_node.id);app_to_part[a].insert(min_node.l);part[min_node.l].app_to_node[a].insert(min_node.id);cout << min_node.id << ' ';}cout << endl;}return 0;
}

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

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

相关文章

德人合科技|天锐绿盾加密软件——数据防泄漏系统

德人合科技是一家专注于提供企业级信息安全解决方案的服务商&#xff0c;提供的天锐绿盾加密软件是一款专为企业设计的数据安全防护产品&#xff0c;主要用于解决企事业单位内部敏感数据的防泄密问题。 www.drhchina.com PC端&#xff1a; https://isite.baidu.com/site/wjz012…

Redis精讲

redis持久化 RDB方式 Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中. 快照文件称为RDB文件, 默认是保存在当前运行目录. [rootcentos-zyw ~]# docker exec -it redis redis-cli 127.0.0.1:6379> sav…

速卖通商品采集API:关键字搜索商品item_search、获取商品详情item_get

item_get-获得aliexpress商品详情 item_search-按关键字搜索aliexpress商品 公共参数 请求地址: aliexpress.item_search/aliexpress.item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是…

03-安装配置jenkins

一、安装部署jenkins 1&#xff0c;上传软件包 为了方便学习&#xff0c;本次给大家准备了百度云盘的安装包 链接&#xff1a;https://pan.baidu.com/s/1_MKFVBdbdFaCsOTpU27f7g?pwdq3lx 提取码&#xff1a;q3lx [rootjenkins ~]# rz -E [rootjenkins ~]# yum -y localinst…

windows下pytorch的dataloader多进程(num_workers)问题,为何num_workers的值只能为0?

问题背景介绍 本人是windows系统&#xff0c;在使用torch.utils.data.Dataloader加载torchvision中的数据集时&#xff0c;将其中的形参num_workers设置为了大于0的数&#xff0c;然后出现以下错误。 原因 在 Windows 系统下&#xff0c;num_workers 参数在使用 PyTorch 的 t…

记一次 .NET某设备监控自动化系统 CPU爆高分析

一&#xff1a;背景 1. 讲故事 先说一下题外话&#xff0c;一个监控别人系统运行状态的程序&#xff0c;结果自己出问题了&#xff0c;有时候想一想还是挺讽刺的&#xff0c;哈哈&#xff0c;开个玩笑&#xff0c;我们回到正题&#xff0c;前些天有位朋友找到我&#xff0c;说…

VideoDubber时长可控的视频配音方法

本次分享由中国人民大学、微软亚洲研究院联合投稿于AAAI 2023的一篇专门为视频配音任务定制的机器翻译的工作《VideoDubber: Machine Translation with Speech-Aware Length Control for Video Dubbing》。这个工作将电影或电视节目中的原始语音翻译成目标语言。 论文地址&…

购买须知:腾讯云服务器99元一年限制月流量300GB

腾讯云99元服务器限制月流量吗&#xff1f;是的&#xff0c;限制月流量&#xff0c;每月提供300GB月流量&#xff0c;超出部分的流量&#xff0c;需要额外支付流量费&#xff0c;价格为0.8元每GB。可以在腾讯云百科 txy.wiki 查看当前99元服务器详细配置和最新的优惠券信息。如…

linux上安装fastdfs及配置

一、基础环境准备 1、所需软件 名称说明libfastcommonfastdfs分离出的一些公用函数包fastdfsfastdas软件包fastdfs-nginx-modulefastdfst和nginx的关联模块nginxnginxl软件包 2、编辑环境 安装一些基础的支持环境 yum install git gccc gcc-c make automake autoconf libto…

复制表

目录 复制表 将部门 30 的所有员工信息保存在 emp30 表中 将复杂查询结果创建为表 只将 emp 表的结构复制为 empnull 表 从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 复制表 严格来说&#xff0c;复制表不是复制操作&am…

Node.Js编码注意事项

Node.js 中不能使用 BOM 和 DOM 的 API&#xff0c;可以使用 console 和定时器 APINode.js 中的顶级对象为 global&#xff0c;也可以用 globalThis 访问顶级对象 浏览器端js的组成 Node.js中的JavaScript组成 相比较之下发现只有console与定时器是两个API所共有的&#xff…

Graphpad Prism10.2.1(395) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

windows server 2019 服务器配置的方法步骤

一、启用远程功能二、测试三、解决多用户登录的问题 一、启用远程功能 右键点击【此电脑】–【属性】&#xff0c;进入“【控制面板\系统和安全\系统】”&#xff0c;点击-【远程设置】(计算机找不到就使用【winE】快捷键) 2、在“远程桌面”下方&#xff0c;点击【允许远程连…

多核多cluster多系统之间缓存一致性概述

目录 1.思考和质疑2.怎样去维护多核多系统缓存的一致性2.1多核缓存一致性2.2多Master之间的缓存一致性2.3dynamIQ架构同一个core中的L1和L2 cache 3.MESI协议的介绍4.ACE维护的缓存一致性5.软件定义的缓存和替换策略6.动图示例 本文转自 周贺贺&#xff0c;baron&#xff0c;代…

StableDiffusion3 官方blog论文研究

博客源地址&#xff1a;Stable Diffusion 3: Research Paper — Stability AI 论文源地址&#xff1a;https://arxiv.org/pdf/2403.03206.pdf Stability.AI 官方发布了Stable diffusion 3.0的论文研究&#xff0c;不过目前大家都沉浸在SORA带来的震撼中&#xff0c;所以这个水…

JavaScript基础Ⅱ

接上文 JavaScript基础Ⅰ JavaScript基础Ⅰ-CSDN博客 目录 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数 第3章 JS事件 14-事件的绑定方式 常用事件(了解) 15-常用事件 第4章 JS内置对象(掌握) 16-数组 17-日期 18-数学运算 19-数字 20-全局函数 第2章…

CrossOver2024实现Mac/Linux上快速运行Win软件和游戏

作为软件产品专家&#xff0c;我对各类软件都有较为深入的了解&#xff0c;下面介绍CrossOver2024这款软件的功能特点。 CrossOver2024是一款功能强大的类虚拟机软件&#xff0c;它的设计目标是在Mac和Linux系统上实现Windows软件和游戏的快速运行。这款软件不仅具有出色的兼容…

【SSM】整合原理和配置实战

文章目录 SSM整合是什么&#xff1f;SSM整合核心问题第一问&#xff1a;SSM整合需要几个IoC容器&#xff1f;第二问&#xff1a;每个IoC容器对应哪些类型组件&#xff1f;第三问&#xff1a;IoC容器之间关系和调用方向&#xff1f;第四问&#xff1a;具体多少配置类以及对应容器…

Mybatis-Plus——04,自动填充时间(新注解)

自动填充&#xff08;新注解&#xff09; 一、数据库添加两个字段二、实体类字段属性上增加注解三、编写填充器四、查看结果4.1 插入结果4.2 修改结果 五、同步修改5.1实体类属性改成 INSERT_UPDATE5.2 在填充器的方法这里加上 updateTime5.3 查看结果————————创作不易…

英飞凌电源管理PMIC的安全应用

摘要 本篇文档主要用来介绍英飞凌电源管理芯片TLF35584的使用&#xff0c;基于电动助力转向应用来介绍。包含一些安全机制的执行。 TLF35584介绍 TLF35584是英飞凌推出的针对车辆安全应用的电源管理芯片&#xff0c;符合ASIL D安全等级要求&#xff0c;具有高效多电源输出通道&…