考虑到在虚拟机部署中资源提供商通常希望自己的收益最大化,现假设有一台宿主机,共有x个cpu和y GB的内存,用户可以采取自己报价的方式向资源提供商申请使用虚拟机资源,譬如说付w元申请a个cpu和b GB内存的一台虚拟机。请你设计一个算法,让资源提供商可以合理地安排虚拟机,使得自己的收益最大化。
输入:
n x y
2 4 200
4 2 150
…
考虑到在虚拟机部署中资源提供商通常希望自己的收益最大化,现假设有一台宿主机,共有x个cpu和y GB的内存,用户可以采取自己报价的方式向资源提供商申请使用虚拟机资源,譬如说付w元申请a个cpu和b GB内存的一台虚拟机。请你设计一个算法,让资源提供商可以合理地安排虚拟机,使得自己的收益最大化。
输入:
n x y
2 4 200
4 2 150
…
贪心法就是选择一种目前最好的策略来实现,而不从整体来看,本题就可以选择单位cpu价钱最高来实现
import sys
a = list(map(int, input().split())) # 用数组a来存储参与报价的用户的个数云端要存储的cpu个数,容量大小
a1 = a[0] # 存储用户个数,要输入几行数据
a2 = a[1] # 存储cpu的个数
a3 = a[2] # 存储容量
b = [] # 用二维数组b来存储用户的报价信息
b1 = [0]*a1 #数组b1存储单位内存价格
b2 = [0]*a1 #数组b2存储单位容量价格
p1 = [0]*a1
p2 = [0]*a1 #分别记录位置信息
num_sum = 0 #记录第一种贪心的数据
sto_sum = 0 #cpu累加个数和内存容量累加初始化为0
prize_sum = 0 #总价值
num_sum1 = 0 # 记录第二种贪心策略的数据
sto_sum1 = 0
prize_sum1 = 0
for i in range(a1): #内存数,容量数,价格
b.append(list(map(int, input().split())))
for k in range(a1):
b1[k] = b[k][2]/b[k][0]
b2[k] = b[k][2]/b[k][1]
p1[k] = k
p2[k] = k
for i in range(0, a1-1): # 对单位CPU进行排序,并且记录位置
for j in range(1, a1-i):
if b1[j]> b1[j-1]:
tmp = b1[j-1]
b1[j-1] = b1[j]
b1[j] = tmp
tmp = p1[j-1]
p1[j-1] = p1[j]
p1[j] =tmp
for i in range(0, a1-1): # 对单位容量进行排序,记录位置
for j in range(1, a1-i):
if b2[j]> b2[j-1]:
tmp = b2[j-1]
b2[j-1] = b2[j]
b2[j] = tmp
tmp = p2[j-1]
p2[j-1] = p2[j]
p2[j] =tmp
# 不能超过cpu总个数,不能超过总容量,从大到小开始累加
while num_sum <= a2 and sto_sum <= a3:
for i in range(a1):
num_sum = num_sum+b[p1[i]][0]
sto_sum = sto_sum+b[p1[i]][1]
prize_sum = prize_sum+b[p1[i]][2]
while num_sum1 <= a2 and sto_sum1 <= a3:
for i in range(a1):
num_sum1 = num_sum1 + b[p2[i]][0]
sto_sum1 = sto_sum1 + b[p2[i]][1]
prize_sum1 = prize_sum1 + b[p2[i]][2]
if prize_sum > prize_sum1:
print(prize_sum)
else:
print(prize_sum1)