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

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



本专栏食用建议

  • 随着文章越更越多,本专栏的内容到底该如何食用,笔者在此做出如下建议,望能为参赛的诸位节省宝贵的时间和精力:
  • 本专栏内容第一篇为思路的初步探索,适合没有多少思路或者对赛题把握比较模糊的朋友。当然,在赛程后期,有朋友已经做完提交想要在温故一遍赛题的话,亦可回顾此文
  • 至于第二篇文章,确实建议大家可以详细浏览,包含着鄙人对于此题的主要思路,至少相比于同类文章,个人认为此想法是最为可能落地的一种(暂不谈算法效率)。
  • 接下来的三篇文章(后面陆续如此),主要是对第二篇文章的代码实现,可尽可能地去读最新的代码,毕竟,写着写着发现之前问题的事情也不是头一次发生,望诸位见谅~
  • 当然,以上不过是鄙人的小小建议,若有朋友希望能够完全的去理解鄙人解题的全部心路历程,逐篇阅读亦未尝不可~

前言

  • 生活中的事情总是难料,好在感谢每一位朋友的支持,让本人也能在庸碌中不断地压榨自己的潜力,争取不辜负每一份期待~
  • 最近总是只有晚间才有一息尚缓的时间,本来预计为各位补上前日所欠的伪代码,但谁知运行昨日代码时才发觉,输入的结果竟有些与自己预料有所不同。怎奈昨日只写代码一时爽,不写注释今遭殃。几经调试,解决了问题,但时间也离午夜不远,果断补上详细注释,so今天又要拖欠诸位了,再望海涵~
  • 预计明日应该是最近时间最充裕的日子,希望能为诸位补更加料,为赛事添一份欢愉^-^

3月15日更新


1.昨日输入代码+详细注释

# 代码解决2021华为软件挑战赛中的数据输入问题
# 所有注释为了便于说明
# 以training-1.txt中的数据为例
# !!!*****!!! 为昨日代码的出错点
# 技艺不精,私事繁忙,照顾不周,多担待!

# 服务器类
class Host:
    hostType = ''           #服务器类型
    hostCpuNum = 1          #服务器CPU数
    hostMemSize = 1         #服务器内存容量
    hostHardWareCost = 1    #服务器硬件开销
    hostDayCost = 1         #服务器每日开销
    hostXingJiaBi = 1       #服务器性价比:(硬件开销*(核数/核数+内存容量)/核数) 
    						# + (硬件开销*(内存容量/核数+内存容量)/内存容量)
    hostCoreMemBi = 1       #服务器核内比:核数/内存容量

    # 计算性价比
    # !!!认真观察的道友应该能发现,此处公式与昨日略有不同
    # 但与昨日数值结果相同,可自己细品,理解鄙人定义的性价比的意义!!!
    def xingJiaBi(self):
        self.hostXingJiaBi = ((self.hostHardWareCost * self.hostCpuNum / (self.hostCpuNum + self.hostMemSize)) / self.hostCpuNum) + ((self.hostHardWareCost * self.hostMemSize / (self.hostCpuNum + self.hostMemSize)) / self.hostMemSize)

    # 计算核内比
    def coreMemBi(self):
        self.hostCoreMemBi = self.hostCpuNum / self.hostMemSize
# 虚拟机类
class Vm:
    vmType = ''
    vmCpuNum = 1
    vmMemSize = 1
    vmDoubleOrNot = 1
    vmCoreMemBi = 1

    # 计算核内比
    def coreMemBi(self):
        self.vmCoreMemBi = self.vmCpuNum / self.vmMemSize

# 每日请求列表类
class DayRequire:
    requireNum = 0
    requireType = ''
    vmType = ''
    vmId = ''
    # !!!昨日出错重点,以前一直没发现,pyhton类中定义的列表是全局变量!!!
    # 解决方法:通过初始化方法,将列表定义为self的局部变量
    def __init__(self):
        self.addRequireList = []
        self.delRequireList = []

    # !!!增加了两个为列表赋值的函数,只为美化代码!!!
    def addRequireListAppend(self):
        self.addRequireList.append((self.requireType, self.vmType, self.vmId))

    def delRequireListAppend(self):
        self.delRequireList.append((self.requireType, self.vmId))

# 一次性读入全部文件
def readtxt(filename):
    try:
        f = open(filename, "r")
        line = f.read()
        return line
    finally:
        f.close()

# 将输入的数据处理,输出为hostListAll, vmListAll, dayListAll列表
# hostListAll, vmListAll 分别代表服务器总表与虚拟机总表
# dayListAll中存储800天的数据,每一个列表元素为一个类(oneDay)
def inputData(allData):
    flag = 0
    for i in range(len(allData)):
        if allData[i].isdigit():
            flag += 1
            # flag=1 准备处理出服务器总表
            if flag == 1:
                hostTypeNum = int(allData[i])
                hostListAll = [allData[i + j + 1] for j in range(hostTypeNum)]
            # flag=2 准备处理出虚拟机总表
            elif flag == 2:
                vmTypeNum = int(allData[i])
                vmListAll = [allData[i + j + 1] for j in range(vmTypeNum)]
            # flag=3 接收所有天的全部请求 本页代码中的小弯弯
            elif flag == 3:
                dayNum = int(allData[i])
                flag1 = 0
                dayListAll = [0 for j in range(dayNum)] #存DayRequire类
                # 遍历800日后的全部输入 可体会一下同级下的break
                for j in range(i + 1, len(allData)):
                    if allData[j].isdigit():
                        flag1 += 1
                        # 读不懂可解开下句封印 尝试观察输出
                        # print(allData[j], allData[j+1])
                        #过滤请求类数据,接收每日请求的数值 譬如第一日142
                        if flag1 <= dayNum:
                            #新建一个类 用于接收每一天的请求数据
                            oneDay = DayRequire()
                            oneDay.requireNum = int(allData[j])
                            # 读不懂可解开下句封印 尝试观察输出
                            # print(oneDay.requireNum)
                            # 下方for循环接收每一天的请求数据 存到oneDay的类中 传给dayListAll
                            for k in range(j + 1, j + oneDay.requireNum + 1):
                                # 按逗号切分每条请求
                                tmpeList = allData[k].split(',')
                                # 切分后的数组若只有两项表明为del请求 传给oneDay.delRequireList
                                if len(tmpeList) == 2:
                                    # 清除多余空格、括号
                                    oneDay.requireType = tmpeList[0].replace('(', '')
                                    oneDay.vmId = tmpeList[1].replace(')', '').replace(' ', '')
                                    oneDay.delRequireListAppend()
                                # 切分后的数组若有三项表明为add请求 传给oneDay.addRequireList
                                elif len(tmpeList) == 3:
                                    # 清除多余空格、括号
                                    oneDay.requireType = tmpeList[0].replace('(', '')
                                    oneDay.vmType = tmpeList[1].replace(' ', '')
                                    oneDay.vmId = tmpeList[2].replace(')', '').replace(' ', '')
                                    oneDay.addRequireListAppend()
                            dayListAll[flag1 - 1] = oneDay
                # 执行完flag==3中的内容后,可直接跳出最外层for循环
                break
    # 为Host类赋值,使hostListAll中每一个元素为一个Host类
    i = 0
    for host in hostListAll:
        #分割数据去除空格、括号
        host = host.split(',')
        host[0] = host[0].replace('(', '').replace(' ', '')
        host[4] = host[4].replace(')', '').replace(' ', '')

        #赋值数据
        tmpeHost = Host()
        tmpeHost.hostType = host[0]
        tmpeHost.hostCpuNum = int(host[1])
        tmpeHost.hostMemSize = int(host[2])
        tmpeHost.hostHardWareCost = int(host[3])
        tmpeHost.hostDayCost = int(host[4])
        tmpeHost.xingJiaBi()
        tmpeHost.coreMemBi()
        hostListAll[i] = tmpeHost
        i += 1
    # 为Vm类赋值,使vmListAll中每一个元素为一个Vm类
    i = 0
    for vm in vmListAll:
        #分割数据去除空格、括号
        vm = vm.split(',')
        vm[0] = vm[0].replace('(', '').replace(' ', '')
        vm[3] = vm[3].replace(')', '').replace(' ', '')

        # 赋值数据
        tmpeVm = Vm()
        tmpeVm.vmType = vm[0]
        tmpeVm.vmCpuNum = int(vm[1])
        tmpeVm.vmMemSize = int(vm[2])
        tmpeVm.vmDoubleOrNot = int(vm[3])
        tmpeVm.coreMemBi()
        vmListAll[i] = tmpeVm
        i += 1
    i = 0

    return hostListAll, vmListAll, dayListAll

def main():
    # to read standard input
    # process
    # to write standard output
    # sys.stdout.flush()

    #以training-1.txt为示例
    filename = "training-1.txt"

    #按换行分割全部数据
    allData = readtxt(filename).split('\n')
    # 根据下一条注释可以返回分割后的数据
    # print(allData[0])
    [hostListAll, vmListAll, dayListAll] = inputData(allData)

    # 根据下一条的输出,可显示第一天第一条请求
    # print(dayListAll[0].addRequireList[0])


if __name__ == "__main__":
    main()

总结

Ps:

  • 本题的数据量需要关注一下,队友感觉需要多线程或多进程并发实现算法效率的提高,望各位朋友注意~
  • 如果大家有什么好的思路,或者本文代码的不妥之处,欢迎在评论区吐槽留言~

猜你喜欢

转载自blog.csdn.net/weixin_44459972/article/details/114853832