Programmierübung @8-2

Thema eins

An einigen Universitäten erhalten Studierende bestimmte Stipendienpunkte für die Veröffentlichung von Arbeiten. Darüber hinaus ist bei einer Arbeit die Reihenfolge der Autoren unterschiedlich und auch die Bonuspunkte sind unterschiedlich. Bei dieser Frage kann eine Arbeit höchstens drei Autoren haben, von denen 3 Punkte für den ersten Autor, 2 Punkte für den ersten Autor und 1 Punkt für den dritten Autor hinzugefügt werden. In diesem Jahr veröffentlichte die Schule insgesamt n Aufsätze. Sie müssen jeden Autor und die Gesamtzahl der entsprechenden Bonuspunkte in alphabetischer Reihenfolge von klein nach groß ausgeben.

Eingabebeschreibung
Geben Sie in die erste Zeile eine positive ganze Zahl n (1≤n≤100) ein, die die Anzahl der Papiere angibt.
In den nächsten n Zeilen stellt die erste Zahl in jeder Zeile die Anzahl der Autoren des Artikels dar. Geben Sie dann die entsprechende Anzahl von Zeichenfolgen ein, die aus englischen Kleinbuchstaben bestehen. Jeweils zwei Zeichenfolgen werden durch Leerzeichen getrennt, um den Namen dieses Artikels darzustellen des Erstautors, Zweitautors, ... der Arbeit. Die Länge des Namens jedes Autors beträgt nicht mehr als 20, und jede Arbeit hat maximal drei Autoren. Die Namen dieser drei Autoren sind unterschiedlich. In der Ausgabebeschreibung werden der Name jedes Autors
und
die entsprechenden Gesamtbonuspunkte in alphabetischer Reihenfolge ausgegeben. Getrennt durch Leerzeichen . Die Informationen jedes Autors werden in einer separaten Zeile ausgegeben.

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)

Operationsergebnis:

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

Thema 2:

Ein Baum ist ein ungerichteter zusammenhängender Graph mit n Punkten und n-1 Kanten, und alle zwei Punkte haben einen eindeutigen einfachen Pfad. Ein Wurzelbaum bezieht sich auf einen Baum, bei dem einer der Knoten der Wurzelknoten ist. Ein Blattknoten bezieht sich auf einen Knoten mit einem Grad von 1 außer dem Wurzelknoten. Der Grad eines Punktes bezieht sich auf die Anzahl der mit ihm verbundenen Punkte. In einem Baum mit Wurzeln ist die Tiefe eines Punktes die Anzahl der Kanten in einem einfachen Pfad zwischen ihm und dem Wurzelknoten.
Auf einem bestimmten Wurzelbaum mit der Wurzel 1 gibt es zwei Knoten a und eine Raupe auf jedem Knoten b. Diese beiden Raupen dringen nur bis zum tieferen Punkt vor und stoppen, wenn die Raupe den Blattknoten erreicht. Angenommen, der Knoten, zu dem die erste Raupe gehen kann, ist p, und der Knoten, zu dem die zweite Raupe gehen kann, ist P2. Sie möchten die Anzahl der Binärgruppen (P1, P2) wissen (p kann gleich p2 sein). Es liegen insgesamt Q-Anfragen vor.

Eingabebeschreibung :
Zwei positive Ganzzahlen n in der ersten Zeile, Q (1≤n, Q≤50000)
n-1 positive Ganzzahlen f2, f3...fn, (1<fi≤i) in der zweiten Zeile, die den Knoten darstellen i am Baum Es gibt eine Kante zwischen und fi. Die dritte Zeile enthält Q positive ganze Zahlen a1, a2..., aQ (1≤a¡≤n);
die vierte Zeile enthält Q positive ganze Zahlen b1, b2,...bQ (1≤bi≤n, ai ist nicht gleich zu bi;) Die dritte Zeile und die vierte Zeile geben ai an, und bi ist die
Knotenausgabebeschreibung große
Ausgabe zu vermeiden, müssen Sie die XOR-Summe ausgeben aller Antworten auf die Frage.

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)

Operationsergebnis:

12

Supongo que te gusta

Origin blog.csdn.net/cjw838982809/article/details/132072833
Recomendado
Clasificación