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