问题 A: 天梯评分系统
题目描述
在一个下雨的日子,沈学姐和四个好基友约定无事一同打dota(dota是一个5对5的MOBA类游戏)因为想证明谁最NB,他们就全部注册新号去爬天梯了。天梯有一套完整的评分系统,它可以根据每位选手每局的数据进行评分,因为dota的英雄既有辅助又有ganker还有后期,所以不同的英雄的评分标准不一样。可惜那天天梯服务器维护,无法进行评分。于是,他们记录下每一局的数据,找你来帮忙,希望你能够帮他们仿照天梯编一个评分系统,以便于他们比较谁是真正的神牛。
已知对于每个账号每个英雄的初始积分都是1200分,并且该账号的天梯积分是所有使用过的英雄的积分的加权平均数(按次数加权,最终用整除)。每局一个英雄的数据包括主数据(杀敌/死亡/助攻)和附数据(破塔/正补/反补),你会得到所出现的英雄的主数据评分标准。此外还会根据附数据评出 MVP,英魂,富豪,破军,偏将,补王的称号,每个称号都有一个得分。而每局英雄的最终得分是由胜负、初始积分、主数据得分和附数据得分决定的。
主数据得分:每个英雄都有对应的 x,y,z 三个评分参数。主数据得分是:杀敌数x+死亡数y+助攻数*z
胜负得分:胜利不影响正常的分,失败方额外扣去 200 分;
附数据得分:MVP:胜利方主数据得分最高者获得 MVP,额外得到 20 分;英魂:失败方主数据得分最高者获得英魂,免去失败扣分;
以下称号仅胜利方获得:
富豪:每个正补得到 40 金钱,每个杀敌得到 250 金钱,每次死亡失去 100 金钱,每次破塔得到 450 金钱,每局游戏获得金钱最多者获得富豪,额外得到10 分;
破军:破塔最多者获得破军,额外得到 10分;
偏将:助攻最多者获得偏将,额外得到 10 分;
补王:反补最多者获得补王,额外得到 10 分;
最终得分=初始积分+主数据得分+附数据的分+胜负得分;
输入
第一行为一个整数T,代表有T组数据。
对于每组数据:
第一行一个整数 n (n<=15),代表所要用到的 n 个英雄主数据评分标准;
第 2到n+1行,第i行三个整数 x,y,z(0<x,z<=10,-10<=y<0,x+z=10),代表编号为i-1的英雄的评分参数。
第 n+2 行一个整数 m (m<=5),代表玩的局数,
n+3 行到第 n+m*6+3 行每 6 行为一组,共m组代表m局游戏,每组第一到第五行代表每局游戏第一个人到第五人的数据,每一行7个正整数,h代表此局该人使用的英雄编号,a,b,c,d,e,f(a,b,c<=20,d<=11,e,f<=100),代表杀敌/死亡/助攻/破塔/正补/反补,第六行一个数,0代表失败,1代表胜利。
输出
对于第i组数据先输出一行“Case #i:”(不含引号)
接下来输出五行,每行一个数,第i行为第i个人的最终天梯积分。
样例输入
1
5
8 -8 2
2 -3 8
9 -5 1
5 -5 5
4 -6 6
1
1 9 1 5 4 90 20
2 1 4 9 0 14 10
3 11 4 2 2 58 44
4 6 2 4 1 33 31
5 7 4 6 1 22 24
1
样例输出
Case #1:
1294
1272
1311
1240
1240
分析:
1、定义初始值init = [1200 for _ in range(5)]
对于每组数据:
2、根据每局最后一行(0或1)来判断是否胜利
3、情况Win:计算主数据,更新init,同时MVP+=20
计算金钱数,更新init,富豪+=10
计算破塔数,更新init, 最多的+=10
计算助攻数,最多的+=10
计算反补数,最多的+=10
4、情况Lose:所有玩家-200,计算主数据,更新init,同时英魂+200
代码如下:
#encoding:utf-8
def calPrimaryData(list1,list2): #计算主数据
list = []
for i in range(len(list1)):
list.append(list1[i]*list2[i])
return sum(list)
#开始输入T组数据
T = int(input())
init = [1200 for _ in range(5)] # 定义5个人的初始分数
for i in range(T):
n = eval(input()) #输入英雄数目n
heros = list()
for j in range(n): #输入每个英雄的主数据权重
heros.append(list(map(int,input().split())))
m = eval(input()) #输入玩的局数
datas = {}
for item in range(m): #每局输入6行,其中最后一行代表胜负
data = []
for it in range(6):
data.append(list(map(int,input().split())))
datas[item+1] = data
flag = data[-1][0] #1代表胜,0则为败
if flag: #win
primaryData = []
for j in range(5):
tempResultPri = calPrimaryData(heros[data[j][0]-1],data[j][1:4])
primaryData.append(tempResultPri)
init[j]+=tempResultPri
init[primaryData.index(max(primaryData))]+=20 #mvp加20分
#计算金钱数
money = []
for j in range(5):
temp = data[j][1]*250+data[j][4]*450-100*data[j][2]+40*data[j][5]
money.append(temp)
init[money.index(max(money))]+=10
#计算破塔数
towers = []
for j in range(5):
towers.append(data[j][4])
init[towers.index(max(towers))]+=10
#计算助攻数目
helps = []
for j in range(5):
helps.append(data[j][3])
init[helps.index(max(helps))]+=10
#计算反补数
kills = []
for j in range(5):
kills.append(data[j][6])
init[kills.index(max(kills))]+=10 #胜利情况处理完毕
elif flag==0: #lose
for j in range(5):
init[j]-=200
#计算主数据
primaryData = []
for j in range(5):
tempResultPri = calPrimaryData(heros[data[j][0] - 1], data[j][1:4])
primaryData.append(tempResultPri)
init[j] += tempResultPri
init[primaryData.index(max(primaryData))] += 200 # 英魂加200分
#开始输入第一组数据
print("Case #"+str(i+1))
for s in init:
print(s)