2021华为软挑赛题_思路分析——实时更新,做多少更多少

2021华为软挑赛题_思路分析——实时更新,做多少更多少

赛题直达
https://download.csdn.net/download/weixin_44459972/15731297


文章目录

  • 2021华为软挑赛题_思路分析——实时更新,做多少更多少
    • 3月10日更新
      • 一、赛题分析
        • 1. 赛题输入解读:
        • 2. 赛题解决大致流程分析:
    • 3月11日更新
      • 二、输入数据梳理:
        • 1. 题中所给样例输入如下:
        • 2. 样例解读:
        • 3. 解决方案:
    • 3月12日更新
      • 三、换一种解题思路
        • 1. 引入:
        • 2. 解决方案概述:
          • 1. 解题相关前提定义:
          • 2. 解题流程:


3月10日更新


一、赛题分析

1. 赛题输入解读:

1.输入N,(1≤N≤100)

2.输入N行(元组),可以采购的服务器类型数量

型号 CPU 核数 内存大小 硬件成本 每日能耗成本
host0Y6DP 300 830 141730 176
hostHV3A3 290 580 111689 139
hostD4V30 418 412 121272 152
…… …… …… …… ……

3.输入M,(1≤M≤1000)

4.输入M行(元组),售卖的虚拟机类型数量

型号 CPU 核数 内存大小 是否双节点部署
vm38TGB 124 2 1
vmMRUNJ 60 2 1
…… …… …… ……

5.输入T,(1≤T≤1000),T 天的用户请求序列

6.输入R,非负整数,当天共有 R 条请求

7.输入R行(元组),每日增/删的请求

add/del 虚拟机型号 虚拟机 ID
add vmPCXA5 264022204
del NULL 897872834
…… …… ……

2. 赛题解决大致流程分析:

根据已有的输入数据,大致可分为三类:服务器数据、虚拟机数据、每日请求数据。

  1. 为数据定义相关类(除三类输入数据外,应该有一个类记录当拥有的总资源以及总花销)

  2. 根据服务器数据,可先分析一波服务器的性价比,决定今后购进服务器时,购进那种最合适。

  3. 服务器性价比具体计算方式:

  • (硬件成本/CPU 核数)核心数/(内存数+核心数)+
    (硬件成本/内存大小)
    内存数/(内存数+核心数)
  1. 确定是预购服务器资源,根据当日请求调整后一天的购买服务器资源策略,还是第二天处理第一天的请求。因为实际情况应该是先有资源,再有请求。或者可以,两个都有

  2. 算法大致流程(肯定还有问题):

2021华为软挑赛题_思路分析——实时更新,做多少更多少_第1张图片

Ps:当前思路仅供参考,不周之处海涵。


3月11日更新


二、输入数据梳理:

1. 题中所给样例输入如下:

#总输入
2
(NV603, 92, 324, 53800, 500)
(NV604, 128, 512, 87800, 800)
2
(c3.large.4, 2, 8, 0)
(c3.8xlarge.2, 32, 64, 1)
3
2
(add, c3.large.4, 5)
(add, c3.large.4, 0)
2
(del, 0)
(add, c3.8xlarge.2, 1)
3
(add, c3.large.4, 2)
(del, 1)
(del, 2)

2. 样例解读:

2#种
(NV603, 92, 324, 53800, 500)
(NV604, 128, 512, 87800, 800)

服务器总表 = (型号, CPU 核数, 内存 大小, 硬件成本, 每日能耗成本)

2#种
(c3.large.4, 2, 8, 0)
(c3.8xlarge.2, 32, 64, 1)

虚拟机总表 = (型号, CPU 核数, 内存 大小, 是否双节点部署)

3#天
2#条
(add, c3.large.4, 5)
(add, c3.large.4, 0)
2#条
(del, 0)
(add, c3.8xlarge.2, 1)
3#条
(add, c3.large.4, 2)
(del, 1)
(del, 2)

3. 解决方案:

1.依据每一天的虚拟机请求数据,将add请求加入addList中,将del请求加入delList中。

  • addList(虚拟机型号, 虚拟机 ID)
  • delList(虚拟机 ID)

2.addlist、dellist中的数据会被前一天的数据覆盖(建议读一天处理一天的数据,否则需要接受800天的数据,每天还需单独存放,会比较麻烦),因此建立一个requireList记录全部已经添加过得虚拟机(方便执行删除操作)。

  • requireList(虚拟机 ID)

3.接下来对当天的请求数据进行处理:

If delList == NuLL:
	调用Shopping()方法
else:
	调用Del()方法

其中Shopping()方法应该包含:

  1. 匹配:addList中的虚拟机型号虚拟机总表匹配,得到addList中每一项的 CPU核数, 内存大小, 是否双节点部署,得到dayVmRequireList;

  2. 加和:将dayVmRequireList中每一项的 CPU核数, 内存大小进行加和,分别得到coreNum、memoryNum。

  3. 购买:依据之前性价比功能选出的性价比最优的服务器的CPU核数(core), 内存大小(memory),取shoppingNum为服务器购买的数量。服务器购买数量公式如下:

shoppingNum = ⌈Max(coreNum / core, memoryNum / memory)⌉

  1. 分配:将dayVmRequireList中的数据按照单双节点排序,双节点在上,即先分配双节点(保证尽可能少的产生空隙,但这种方法每台服务器都有可能存不满)。若最终分配完成后发现服务器不够,则再买一台服务器,完成分配。

  2. 调度:(暂不考虑)

Ps:目前只考虑完整运行,购买、分配、调度有待扩展


3月12日更新


三、换一种解题思路

将购买、分配等问题统筹考虑,不在单线分开去做。
Ps:前提不考虑删除请求的,因为删除请求会涉及调度问题。


1. 引入:

刷Leetcode时遇到一道题:

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
原题链接直达:https://leetcode-cn.com/problems/combination-sum/

通俗的讲,其大致意思就是让人凑数:从一个数组 candidates中找两个数加和等于目标数 target。本题借鉴这种解法,完成虚拟机的购买、分配和调度等问题。

2. 解决方案概述:

1. 解题相关前提定义:
  • 服务器总表 = (host型号, hostCPU核数, host内存大小, 硬件成本, 每日能耗成本,性价比)
  • 虚拟机总表 = (vm型号, vmCPU核数, vm内存大小, 是否双节点部署)
  • 每日请求总表 = (vm型号, 虚拟机 ID, vmCPU核数, vm内存大小, 是否双节点部署)

Ps:接下来将以training-data\training-1.txt中的第一天的请求数据为例加以说明。


  • 服务器总表:80条数据,每一条代表一款可以购买的服务器;
  • 虚拟机总表:800条数据,每一条代表一款可供用户购买的虚拟机;
  • 每日请求总表:142条数据,数据与“虚拟机总表”匹配得来,每一条数据代表一个用户购买了一台虚拟机的请求。
2. 解题流程:
  • 首先,将服务器总表按照性价比进行升序排序(因为之前性价比计算公式算出的性价比越小,购买该服务器的性价比越高)。
  • 其次,遍历每日请求总表,用其中的vmCPU核数, 、vm内存大小依此去服务器总表中每款服务器的hostCPU核数,、host内存大小(这里对于每日请求总表中每一项的访问可以随机组合),并记录凑出每一款服务器的虚拟机的组合情况,以及在该情况下,所凑之数与此款服务器hostCPU核数、host内存大小之间的差值。
  • 接下来便有两种方法选取需要购买的服务器:
  1. 汇总所有80款服务器的凑数结果,寻找结果中差值最小的服务器,若出现相同的情况,选前者购买(因为数据已经提前按照性价比排序)。
  2. 综合性价比与凑数结果的差值,寻找适中者购买(此处有待扩充)。
  • 卖完此服务器台后,从每日请求总表中删除该种情况下对应的虚拟机请求组合。
  • 得到的新的每日请求总表循环执行凑数过程,直至请求总表为空截止。

Ps:此算法完成了虚拟机分配与服务器购买,在不考虑删除请求的前提下,实现了每次购买到的服务器都可以尽可能多的被利用,减少了产生空隙的机会,提高了服务器资源的利用率;同时,按照性价比优先进行购买,可以尽可的多的减少花销(性价比,暂时没有考虑服务器的每日能耗成本)。

你可能感兴趣的:(2021华为软挑,java,算法,华为)