PTA-竞赛排名

  

某循环赛的比赛规则是胜者得3分,和者得1分,败者不得分。请根据各人总得分从高到低进行排名。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入一个整数n(2≤n≤100),表示参赛人数,然后输入n*(n-1)/2行,每行一个比赛结果。每行比赛结果由A、B、f构成,A和B为参赛人名(不含空格),f=1表示A胜B,f=0表示A与B打和。由于总是将胜者排在前面,所以不存在A败于B的情况。

输出格式:

对于每组测试,按名次分行输出,名次与名字之间以一个空格间隔,并列名次的名字在同一行输出,按字典序以一个空格隔开。

输入样例:

2
3
Jack Smith 0
Smith Bob 1
Jack Bob 1
6
a b 1
c a 0
a d 0
a e 1
f a 1
b c 1
d b 0
e b 0
f b 0
c d 1
c e 1
c f 1
d e 0
f d 0
e f 0

输出样例:

1 Jack Smith
3 Bob
1 c
2 a
3 b f
5 d
6 e

这个题其实不难,很多同学可能忽略字典序了,话不多说直接放代码:

from collections import defaultdict


def lolo2(z):
    w = defaultdict(int)        # 当查找字典键不存在时返回0
    for a, b, f in z:
        if f == 1:
            w[a] += 3
            w[b] += 0
        elif f == 0:
            w[a] += 1
            w[b] += 1
    return w


def lolo1():
    n = int(input())
    z = []
    for i in range(n * (n - 1) // 2):
        a, b, f = input().split()
        z.append((a, b, int(f)))
    w = lolo2(z)
    q = sorted(w.items(), key=lambda x: (-x[1], x[0]))

    # lambda表达式,先对下x[1]逆序(默认升序),如果x[1]相等则按x[0]升序


for e, f in enumerate(q, 1):
    if e == 1:
        print(f'{e} {f[0]}', end="")
    else:
        if w == f[1]:
            print(end=" ")
            print(f'{f[0]}', end="")
            e += 1
        else:
            print()
            print(f'{e} {f[0]}', end="")
    w = f[1]
t = int(input())
for i in range(t):
    lolo1()
    if i < t - 1:
        print()

​

我这里使用了一个偷懒的函数 defaultdict,感兴趣的可以去学一下, 当然你们也可以自己用if来判断情况

给你们看一下之前我用if写的代码:

a=eval(input())
z={}
for i in range(a):
    b=eval(input())
    for g in range(int(b*(b-1)/2)):
        c=input().split()
        if c[2]=="1":
            if z.get(c[0])==None or z.get(c[1])==None:
                if z.get(c[0])!=None and z.get(c[1])==None:
                    z[c[0]]=z[c[0]]+3
                    z[c[1]]=0
                elif z.get(c[0])==None and z.get(c[1])!=None:
                    z[c[0]]=3
                else:
                    z[c[0]]=3
                    z[c[1]]=0
            else:
                z[c[0]]=z[c[0]]+3
        else:
            if z.get(c[0])==None or z.get(c[1])==None:
                if z.get(c[0])!=None and z.get(c[1])==None:
                    z[c[0]]=z[c[0]]+1
                    z[c[1]]=1
                elif z.get(c[0])==None and z.get(c[1])!=None:
                    z[c[1]]=z[c[1]]+1
                    z[c[0]]=1
                else:
                    z[c[0]]=1
                    z[c[1]]=1
            else:
                z[c[0]]=z[c[0]]+1
                z[c[1]]=z[c[1]]+1
    d=sorted(z.items(),key=lambda z:(-z[1],z[0]))
    for e,f in enumerate(d,1):
        if e==1:
           print(f'{e} {f[0]}',end="")
        else:
           if w==f[1]:
              print(end=" ")
              print(f'{f[0]}',end="")
              e+=1
           else:
              print()
              print(f'{e} {f[0]}',end="")
        w=f[1]
    if i!=a-1:
        print()
    z={}

 其实这题细心一点大家应该都会写。

   当然,这只是本人对这个题的一下看法,可能用的方法有点笨!

   欢迎读者指教!

  谢谢大家!

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值