编程题练习@8-2

题目一

在一些大学里,学生发表论文的话会有一定的奖学金加分。另外,对于一篇论文,其作者的顺序不同,加分也不相同。在本题中,一篇论文最多仅三个作者,其中第一作者加3分,第一作者加2分,第三作者加1分。在这一年,学校一共有n篇论文发表。你需要输出按照字典序从小到大输出每一名作者以及其对应的加分总数是多少,

输入描述
第一行输入一个正整数n(1≤n≤100),表示论文数量。
接下来n行,每一行第一个数字表示该篇论文的作者数,之后输入对应个数的仅由小写英文字母组成的字符串,每两个字符串用空格隔开,分别表示这一篇论文的第一作者,第二作者,…的名字。每一个作者的名字长度不超过20,每一篇论文最多三个作者,目这三个作者名字都不同,
输出描述
按照字典序从小到大输出每个作者的名字以及其对应的加分总数,中间用空格隔开。每一个作者的信息单独输出一行。

if __name__ == "__main__":

    '''
    用例:
    4
    3 george annie jack
    2 jack peter
    2 peter bakh
    1 zack
    '''
    
    n = int(input()) # 文章数
    
    scores = dict() # 人名-分数字典
    for i in range(n):
        names = list(map(str, input().split())) # 按行输入
        for idx, name in enumerate(names[1:]):
            if not name in scores:
                scores[name] = 0
            scores[name] += 3 - idx
    
    scores = sorted(scores.items(), key=lambda d: d[0]) # 名字按照字典序排序
    
    for name, score in scores:
        print(name, score)

运行结果:

annie 2
bakh 2
george 3
jack 4
peter 5
zack 3

题目二:

树是一张n个点n-1条边的无向联通图,每两个点都有唯一的一条简单路径。有根树是指以其中一个点为根节点的树,叶子节点是指除根节点外度数为1的节点,一个点的度数是指与其相连的点的个数。有根树上,一个点的深度是指其与根节点之间的简单路径的边数。
在某一棵以1为根的有根树上,有两个节点a,b上各存在一只毛毛虫。这两只毛毛虫只会往深度更大的点前进,当毛毛虫走到叶子节点时会停下。设第一只毛毛虫可能走到的节点为p,第二只毛毛虫可能走到的节点为P2,你想要知道二元组(P1,P2)的个数(p可以等于p2)。一共有Q次询问。

输入描述
第一行两个正整数n,Q(1≤n,Q≤50000)
第二行n-1个正整数f2,f3…fn,(1<fi≤i),表示树上节点i与fi之间有一条边。第三行Q个正整数a1,a2…,aQ(1≤a¡≤n);
第四行Q个正整数b1,b2,…bQ(1≤bi≤n,ai不等于bi;) 第三行和第四行表示ai,bi是第个i查询对应的两只毛毛虫所在的节点
输出描述
为了避免输出量较大,你需要输出所有询问的答案的异或和。

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.children = []

def build_tree(n: int, edges: list) -> TreeNode:
    '''构建树'''

    nodes = [TreeNode(i) for i in range(1, n+1)]
    for i, f in enumerate(edges, start=1):
        nodes[f-1].children.append(nodes[i])
    return nodes[0]

def dfs(node: TreeNode, depth_map: dict) -> int:
    '''深搜记录每个树结点的可到达叶子数'''

    if not node.children: # 叶子结点
        depth_map[node.val] = 1
        return 1

    for child in node.children: # 遍历孩子
        if node.val not in depth_map:
            depth_map[node.val] = 0
        depth_map[node.val] += dfs(child, depth_map)
        
    return depth_map[node.val]

if __name__ == "__main__":

    '''
    用例:
    8 4
    1 1 2 2 3 3 3
    4 2 1 5
    5 3 2 8
    '''

    n, Q = map(int, input().split())
    edges = list(map(int, input().split()))
    queries_a = list(map(int, input().split()))
    queries_b = list(map(int, input().split()))

    root = build_tree(n, edges)
    depth_map = dict()
    dfs(root, depth_map)

    xor_sum_result = 0
    for a, b in zip(queries_a, queries_b):
        xor_sum_result ^= depth_map[a] * depth_map[b]

    print(xor_sum_result)

运行结果:

12
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值