【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;
}

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

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

相关文章

Flutter does not exist

Flutter does not exist 原因&#xff1a;Generated.config 配置文件内路径缺失 原因&#xff1a;Flutter SDK缺失 通过配置文件查到Flutter SDK在本地的存放位置FLUTTER_FRAMEWORK_DIR/Users/haijunyan/Documents/flutter/bin/cache/artifacts/engine/ios 真机所需&#xf…

day06、07-MySQL

文章目录 一、MySQL概述1.1 安装1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 二. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库…

【数据结构与算法】贪心算法题解(一)

这里写目录标题 一、455. 分发饼干二、56. 合并区间三、53. 最大子数组和 一、455. 分发饼干 简单 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这…

五种常见户外LED显示屏模组故障维修方法

在户外LED显示屏的使用过程中&#xff0c;可能会出现各种故障&#xff0c;例如连续不亮、坏点等问题&#xff0c;这通常是由LED显示屏模组上出现问题所导致的。以下是针对五种常见户外LED显示屏模组故障的解决办法&#xff1a; 连续不亮或有异常&#xff1a; 这种情况通常导致L…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…

包装类 --java学习笔记

包装类 包装类就是把基本类型的数据包装成对象 基本数据类型与其包装类&#xff1a; 将整型数据包装成对象&#xff1a; 自动装箱&#xff1a;可以自动把基本类型的数据转换成对象 例&#xff1a;Interger a3 12&#xff1b; 自动拆箱&#xff1a;可以自动把包装类型的对象…

地理数据可视化:使用echarts实现地图可视化功能

前言 地图是一种直观而强大的数据可视化工具&#xff0c;能够帮助我们更好地理解地理分布和区域间的差异。在本文中&#xff0c;我们将探讨如何使用 echarts 实现地图功能&#xff0c;展示各个区域的数据分布和趋势。 一、基础使用 <template><div class"chartB…

.net core框架

ASP.NET Core 入门 跨平台开源框架 B/S 类与方法 Console 部分称为“类”。 类“拥有”方法&#xff1b;或者可以说方法存在于类中。 WriteLine() 部分称为“方法”。 想要使用方法就要知道方法在哪里 —————————— 执行流 一次执行一段 ASP.NET Core 是什么东西…

多场成像,快速提高机器视觉检测能力--51camera

多阵列CMOS传感器与芯片级涂层二向色滤光片相结合&#xff0c;可在单次扫描中同时捕获明场、暗场和背光图像。 多场成像是一种新的成像技术&#xff0c;它可以在不同的光照条件下同时捕获多幅图像。再加上时间延迟积分(TDI)&#xff0c;这种新兴的成像技术可以克服许多限制的传…

编译Linux内核并修改版本号后缀为学号-Ubuntu22.04中编译安装Linux内核6.7.8

前言&#xff1a;实验课要求下载最新版本Linux内核并修改版本号&#xff0c;本人在Vmware中Ubuntu22.04中实现&#xff0c;花三天时间查阅大量网站资料。记录一下误打误撞成功的过程&#xff0c;希望对你们有帮助。 目录 一、常规安装步骤&猜想Ubuntu与gcc版本过低 二、安…

【c++】string类的使用及模拟实现

1.我们为什么要学习string类&#xff1f; 1.1 c语言中的字符串 我们先了解一下什么是OOP思想 OOP思想&#xff0c;即面向对象编程&#xff08;Object-Oriented Programming&#xff09;的核心思想&#xff0c;主要包括“抽象”、“封装”、“继承”和“多态”四个方面。 抽象…

2020-2021年江苏省社区行政村边界数据

开展村&#xff08;社区&#xff09;规模优化调整&#xff0c;一是落实中央和省委部署要求的需要。党的十九大作出了实施乡村振兴战略的重大部署。乡村要振兴&#xff0c;合理确定行政村规模是前提、也是基础。2017年以来&#xff0c;国务院和省委省政府相继出台文件&#xff0…

pc端vue2项目使用uniapp组件

项目示例下载 运行实例&#xff1a; 这是我在pc端做移动端底代码时的需求&#xff0c;只能在vue2使用&#xff0c;vue3暂时不知道怎么兼容。 安装依赖包时可能会报&#xff1a;npm install Failed to set up Chromium r756035! Set “PUPPETEER_SKIP_DOWNLOAD” env variable …

羊大师分析羊奶的喝法,都有什么讲究?

羊大师分析羊奶的喝法,都有什么讲究&#xff1f; 羊奶的喝法确实有一些讲究&#xff0c;以下是一些主要的注意事项&#xff1a; 温度控制&#xff1a;羊奶不宜煮沸喝&#xff0c;加热时最好保持在50℃&#xff0d;60℃之间&#xff0c;以避免破坏其营养成分。 饮用时间&…

CleanMyMac X4.15具有哪些功能和特点?

CleanMyMac X具有许多其他功能和特点&#xff0c;以下是一些主要亮点&#xff1a; 系统清理&#xff1a;它能够深入扫描macOS系统&#xff0c;识别并清除各种垃圾文件&#xff0c;如缓存、日志、无用的语言文件等。这不仅有助于释放硬盘空间&#xff0c;还可以提高系统的整体性…

SIGMATEK西格玛泰克CPU模块控制器维修CCP531 12-104-531

Sigmatek的“解决方案”有两方面含义&#xff1a;一方面是指Sigmatek从控制系统、人机界面、伺服驱动系统直到开发平台&#xff0c;都能够提供解决方案&#xff1b;另一方面是指从方案的一开始&#xff0c;Sigmatek便能够位客户提供独特的、量身定做的产品实施方案。 Sigmatek产…

【C++】关键字:auto

文章目录 1. 介绍2. 如何使用 1. 介绍 从C11开始&#xff0c;auto变成了类型指示符&#xff08;之前auto并不是这个作用&#xff09;。使用auto定义变量时必须对其进行初始化&#xff0c;在编译阶段编译器自动推导auto变量的实际类型。因此auto并非是一种“类型”的声明&#…

每日一题——LeetCode1668.最大重复字符串

方法一 includes()repeat()秒了 使用repeat()将word重复i次&#xff0c;看是否包含于sequence中&#xff0c;将最大的i赋值给k var maxRepeating function(sequence, word) {let k0for(let i1;i*word.length<sequence.length;i){if(sequence.includes(word.repeat(i))){k…

人工智能将如何改变我们的工作?

在2023年&#xff0c;生成式人工智能成为最热门的话题。以ChatGPT为例&#xff0c;该平台拥有超1.8亿的订阅用户和近亿的周活跃用户。无论是媒体还是公众&#xff0c;都在广泛讨论生成式人工智能。尽管我对此感到好奇&#xff0c;但我不确定应该提出哪些问题&#xff0c;也不清…

题目:珠宝的最大交替和(蓝桥OJ 3791)

问题描述&#xff1a; 解题思路&#xff1a;&#xff08;思路样例从0开始赋值&#xff09; 注意点&#xff1a;1.S需要开long long 2.需要考虑如果交换的差值&#xff08;即Aj - Ai)为负数的情况。 题解&#xff1a;&#xff08;实例代码为从1开始赋值&#xff0c;因此奇偶要与…