python题目--天梯分数计算

问题 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值