【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.mzph.cn/news/737659.shtml

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

相关文章

揭秘PostgreSQL:超越传统数据库的无限可能!

介绍&#xff1a;PostgreSQL是一个功能强大的开源对象关系数据库系统。以下是对PostgreSQL的详细介绍&#xff1a; 开源性&#xff1a;PostgreSQL是完全开源的&#xff0c;这意味着任何人都可以自由地获取、使用和修改它的源代码。 可定制性&#xff1a;它具有高度可定制性&…

问题解决:NPM 安装 TypeScript出现“sill IdealTree buildDeps”

一、原因&#xff1a; 使用了其他镜像&#xff08;例如我使用了淘宝镜像 npm config set registry https://registry.npm.taobao.org/ &#xff09; 二、解决方法&#xff1a; 1.切换为原镜像 npm config set registry https://registry.npmjs.org 安装typescript npm i …

前端开发的发展史:框架与技术栈的演变

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

告别“死记硬背”,坐席助手让客服新手秒变大咖

在客服行业&#xff0c;新手客服人员常常面临着两大难题&#xff1a;一是需要死记硬背大量的标准答案&#xff0c;二是培训时间长&#xff0c;上岗速度慢。然而&#xff0c;随着科技的发展&#xff0c;这些问题正逐渐得到。今天&#xff0c;我们要为大家介绍一款革命性的客服工…

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹前言第1章 添加文件夹第2章 添加文件路径2.1 相对路径方法2.2 绝对路径方法 总结 前言 在编程的过程中&#xff0c;如果需要在原有的工程基础上新增其它的…

哈希表|202.快乐数

力扣题目链接 int getSum(int n) {int sum 0;while (n) {sum (n % 10) * (n % 10);n / 10;}return sum; }bool isHappy(int n){int sum getSum(n);int hash[820] {0};while (sum ! 1) {if (hash[sum] 1) {return false;} else {hash[sum];}sum getSum(sum);}return true…

探索未来:2024年人工智慧驱动的 AI + 研发趋势

#2024 AI 辅助研发趋势# 当我们站在2024年的风口浪尖时&#xff0c;人工智慧辅助研发的格局即将发生翻天覆地的变化。2023年人工智慧的快速发展为各行业的突破性进步铺平了道路。从研发流程的数位转型&#xff0c;到 AI 开发工具2.0 的出现&#xff0c;未来充满了超越 Copilot…

基于数组的顺序表删除操作

删除算法需要注意&#xff1a; 1. 列表长度为0时不能再删除 2.每次删除后长度减一 3.输入删除的数据在原来列表中不存在&#xff0c;不需要改变原列表 #include <iostream> #define MAX 100; using namespace std;int search(int arr[],int len,int n) {for(int i0; i…

【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现

【2024泰迪杯】A 题&#xff1a;生产线的故障自动识别与人员配置 Python代码实现 1 问题 一、问题背景 随着新兴信息技术的大规模应用&#xff0c;工业生产线的智能化控制技术日益成熟。自动生产线 可以自动完成物品传送、物料填装、产品包装和质量检测等过程&#xff0c;极…

LeetCode - 寻找数组的中心

先学习一下前缀和吧 LCR 012.寻找数组的中心LCR 012. 代码解析 在读题读到左侧元素之和等于右侧所有元素之和的时候&#xff0c;我觉得可以用前缀和&#xff0c;然后结合下面的示例&#xff0c;模拟了一下发现确实可以。 我的想法是搞两个数组&#xff0c;一个来存从左到右数…

微信小程序(五十六)逆地址解析示范

注释很详细&#xff0c;直接上代码 温馨提醒&#xff1a;记得给自己的key配额&#xff0c;基础操作与前提配置参考本专栏第五十四篇 新增内容&#xff1a; 1.逆地址解析基础示范 2.开放经纬度参数 3.只列举修改的js部分&#xff0c;前提配置请看 温馨提醒 源码&#xff1a; ind…

软件开发人员从0到1实现物联网项目:需求分析

文章目录 前言市场调研线下考察竞品参考 项目目标功能需求用户端功能需求商家功能需求系统管理功能需求 非功能需求性能安全性易用性扩展性可靠性 小结 前言 上文对实现自助棋牌室项目涉及到的技术做了调研&#xff0c;尤其是物联网技术。那接下来就是对需求进行一番分析了&am…

王道机试C++第 5 章 数据结构二:队列queue和21年蓝桥杯省赛选择题Day32

目录 5.2 队列 1&#xff0e;STL-queue 课上演示&#xff1a; 基本代码展示&#xff1a; 2. 队列的应用 例:约瑟夫问题 No. 2 题目描述&#xff1a; 思路提示&#xff1a; 代码展示&#xff1a; 例&#xff1a;猫狗收容所 题目描述&#xff1a; 代码表示&#xff1…

蓝桥杯-List集合

目录 List集合实例化 List集合实例化步骤 常用方法 ArrayList方法 1&#xff1a;add(Object element) 2&#xff1a;size() 3&#xff1a;get(int index) 4&#xff1a;isEmpty() 5:contains(Object o) 6&#xff1a;remove(int index) 总结ArrayList list集合的特点…

应用方案 | DCDC电源管理芯片MC34063A

DCDC电源管理芯片 MC34063A MC34063A 为一单片 DC-DC 变换集成电路&#xff0c;内含温度补偿的参考电压源&#xff08;1.25V&#xff09;、比较器、能有效限制电流及控制工作周期的振荡器&#xff0c;驱动器及大电流输出开关管等。外配少量元件&#xff0c;就能组成升压、…

Redis缓存、缓存穿透、缓存雪崩、缓存击穿

1.认识Redis缓存 先来认识一下缓存&#xff0c;再了解redis用作缓存时的作用和问题&#xff0c;以及如何解决redis缓存在的问题。 1.1.什么是缓存 1.2.缓存的优缺点(作用和成本) 2.redis缓存的作用 正常客户端请求服务器&#xff0c;服务器会直接访问数据库&#xff0c;这有…

Selenium自动化测试细节讲解

与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少手动运行的测试。自动化…

【智能家居】东胜物联ODM定制ZigBee网关,助力能源管理解决方案商,提升市场占有率

背景 本文案例服务的客户是专业从事智能家居能源管理的解决方案商&#xff0c;其产品与服务旨在帮助用户监测、管理和优化能源消耗&#xff0c;以提高能源使用效率。 随着公司的扩张&#xff0c;为了增加市场占有率&#xff0c;他们希望找到更好的硬件服务支持&#xff0c;以…

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多&#xff0c;如果要出的话&#xff0c;可能模型都会差不多&#xff0c;因为不会出太难的题&#xff0c;难题基本上都是贪心、DP之类的&#xff0c;所以好好刷题刷熟练就行了&#xff0…

最大的单入口空闲区域

最大的单入口空闲区域 问题描述输入输出代码实现 问题描述 找到最大的单入口空闲区域。 空闲区域是由连通的’O’组成的区域&#xff0c;位于边界的’O’可以是入口&#xff0c; 单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。 如果两个元素…