2021华为软挑(区域初赛)总结
文章目录
一、案例解析
输入
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 # 一共3天
2 # 第一天一共两种操作
(add, c3.large.4, 5)
(add, c3.large.4, 0)
2 # 第二天一共2种草祖宗
(del, 0)
(add, c3.8xlarge.2, 1)
3 # 第三天一共3种操作
(add, c3.large.4, 2)
(del, 1)
(del, 2)
输出
(purchase, 2) # 第一天购买两台服务器
(NV603, 1) # 编号为0,NV603
(NV604, 1) # 编号为1,NV604
(migration, 0) # 迁移0次
(0, A) # 更具第一天的输入操作,表示id为5的虚拟机部署在第0台服务器的A节点
(0, B) # id为0的虚拟机部署在第0太服务器的B节点
(purchase, 0) # 第二天购买0台服务器
(migration, 0) # 迁移0次
(1) # 更具第二天输入的值,表示id为1的虚拟机部署在第1台服务器上(双节点,不需要配置节点)
(purchase, 0) # 第三天,购买0台服务器
(migration, 0) # 迁移0次
(1, B) # 更具第三天输入的值,表示id为2的虚拟机部署在第1台服务器的B节点
需要注意:双节点配置的时候,由于负载均衡,因此节点A和B同时分担服务器的内存和cpu
二、输入输出详解
输入详解
- 第一个数N:表示一共N种服务器
- 接下来N行为所有的服务器
- 说明:
(型号,CPU核数、内存大小、硬件成本,每日能耗成本)
- 存储格式:
型号:CPU核数、内存大小、硬件成本,每日能耗成本
- 第二个数M:表示M种虚拟机
- 接下来M行为所有的虚拟机
- 说明:
(型号、CPU核数、内存大小、是否双节点部署)
- 存储格式:
型号:[CPU核数、内存大小、是否双节点部署]
- 注:0为单节点、1为双节点
- 第三个数T:表示一共有T天
- 接下来T*a行表示T天的请求
- 第四个数S:表示该天有S个请求
- 接下来S行为每天的请求
- 说明:
(add,虚拟机型号,虚拟机ID)
(del,虚拟机ID)
输出详解
- 总共T*a行
- 没以块a表示改天的购买、迁移与添加操作
- a块详解
- 第一个数:
(purchase, Q)
- Q为当天新购买Q太服务器
- 接下来Q行表示购买的服务器类型与个数
- 例:
(NV603, 2)
,表示购买2台NV603型号服务器- 此时,第一台NV603id为0
- 第二台id为1
- 如果有新的服务器购买,则id为3(不管是不是这个类型)
- 第二个数:
(migration, W)
- W为当天迁移的虚拟机数量:W必须小于当前虚拟机总数的5*n/1000
- 接下来W行,每一行表示一个虚拟机的迁移
- 例1:
(虚拟机ID,目的服务器ID)
- (3, 1)表示将 ID 为 3 的虚拟机从当前所在服务器迁移至 ID 为 1 的服务器,该虚拟机必须是双节点部署的
- 例2:
(虚拟机ID,目的服务器ID,目的服务器节点)
- (4, 1, A)表示将 ID 为 4 的虚拟机从当前所在服务器迁移至 ID 为 1 的服务器的 A 节点,该虚拟机必须是单节点部署的。
- 接下来,只需要更具输入来合理的配置该虚拟机所在的服务器即可
- 格式为(服务器ID)或者(服务器ID,部署节点)
- 如果是双节点,则直接输出服务器id
- 如果是单节点,则需要说出节点(A或B)
- 第一个数:
三、易错点提前解析
1.Q的值
在每天的购买服务器之后,我们就需要输出当天购买服务器的类型和每台服务器的台数,因此每天输出的第一行就是(purchase, Q)
,而这个Q就是我们当天购买服务器的总类型数量。
2. 服务器id问题
在每一天,你需要提前说明需要购买的服务器种类,然后在购买完以后再(purchase, Q)
下一次输出每种服务器的个数。也就在这时,在后台和你自己这里就需要知道,从第一个服务器输出开始,就表示它的服务器id了,
比如说:你在第一天。第一次购买了A服务器(该服务器的id为0),然后又购买了新的B服务器(该服务器的id为1),但是还是不够,你就又重新购买了新的服务器A。但是这个时候A的id应该是啥?是继续B后面的id还是A后面的id。按照大赛的规则:对于第i天,如果已经购买了服务器A和B,但再次基础上又想添加一台A,那么在这台A服务器的id必须紧跟在之前购买A的服务器id后。也就是说,如果以前的A为0,B为1。如果又重新买了A服务器,则这台服务器的id必须为1,以前买的服务器id就得变成2。
那如何解决这个问题呢?下面是我的解决思路:
- 先获取这一天每天的增加服务器命令
- 然后依次执行该命令。如果当前服务器够使用,那就直接减去即可。但如果当前服务器不够,那就得重新购买新的服务器。
- 对于服务器id,我们就给与新的服务器id一个伪id(大赛规定佛购买服务器的总量不能超过10w,那我们的服务器id就从10w开始,给每个服务器一段5000的间隔(这个意思是假设这一天购买的服务器规定最多5000台,当然可以增加也可以减少))。我们将虚拟机的配置信息和伪id与挂载节点一起存起来。
- 当一天结束以后,你就可以获得当天的总购买服务器id表,这里存放着当天所购买的所有服务器总类和个数。之后我们更具存放的顺序,依次用新的服务器id替换伪id。
3. 迁移问题
我想大家在写题目的时候,遇到最多的问题就是服务器资源超出限制。但是你明明已经在迁移的时候设置好了各种限定条件,但是为什么还会出现迁移资源超出限制呢?
这是对于判题器来说,他是先进行购买服务器然后再进行迁移最后执行添加和删除操作的。而我自己(可能大多数人和我一样)是先进行执行添加操作(如果服务器不够则购买),然后进行删除最后迁移。但是这样就出现了一个问题,对于你提前删除虚拟机的服务器,在你的后台资源是增加了,但是对于判题器来说它并没有任何服务器的资源增加。这也就导致了你自己的输出是没有任何问题的,但一提交就会出现资源超出的问题。
四、思路分析
下图是最开始我们的解题思路
但是,由于迁移问题,我们需要先执行迁移,然后再进行虚拟机的添加和删除操作。也就是下面的流程