[解题报告] CSDN竞赛第18期

Posted lijiancheng0614

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解题报告] CSDN竞赛第18期相关的知识,希望对你有一定的参考价值。

CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/32

1. 单链表排序

题目

单链表的节点定义如下(C++): class Node public: int element; Node * next; 实现如下函数:Node * sort(Node * head),排序以 head 为头结点的单链表,返回排序后列表的 head 节点;只能修改 next 指针,要求时间复杂度和空间复杂度尽可能优化。

解题报告

模拟,排序输出即可

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, n, arr):
        result = sorted(arr)
        return [str(_) for _ in result]


if __name__ == "__main__":
    n = int(input().strip())
    arr = [int(item) for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(arr)
    print(" ".join(result))

2. 合并二叉树

题目

已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如: 两颗二叉树是: Tree 1 1 / 3 2 / 5 Tree 2 2 / 1 3 4 7 合并后的树为 3 / 4 5 / 5 4 7

示例1
输入
1,3,2,5,2,1,3,#,4,#,7
返回值
3,4,5,5,4,#,7

解题报告

模拟,按顺序相加即可,注意判断 null 的情况

class Solution:
    def __init__(self) -> None:
        pass

    def get(self, x):
        if x == 'null':
            return 0
        return int(x)

    def solution(self, n, m, arr1, arr2):
        k = min(n, m)
        a = []
        for i in range(k):
            x = self.get(arr1[i])
            y = self.get(arr2[i])
            a.append(str(x + y))
        if n < m:
            a += arr2[n:]
        elif n > m:
            a += arr1[m:]
        return a


if __name__ == "__main__":
    arr_temp = [int(item) for item in input().strip().split()]
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    arr1 = [item for item in input().strip().split()]
    arr2 = [item for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(n, m, arr1, arr2)
    print(" ".join(result))

3. n边形划分

题目

已知存在n多边形, 连接多边形所有对角线。 能形成多少区域。

输入描述:

给定整数n。(1<=n<=1e9)

输出描述:

输出区域数,对1e9+7取模

输入样例:

5

输出样例:

11

解题报告

数学

参考 https://zhuanlan.zhihu.com/p/92069094

n 边形(非正)的完全图有多少条线(不包括边): e ( n ) = C n 2 e(n) = C_n^2 e(n)=Cn2,即 n 个点中取 2 个点连成一线

n 边形(非正)的完全图有多少个点: V ( n ) = C n 4 + n V(n) = C_n^4 + n V(n)=Cn4+n,两线交于一点,再加上原来的 n 个点

n 边形(非正)的完全图有多少条边: E ( n ) = C n 2 + 2 C n 4 E(n) = C_n^2 + 2C_n^4 E(n)=Cn2+2Cn4

由欧拉示性数公式,n 边形(非正)的完全图有多少个区域: F ( n ) = E ( n ) − V ( n ) + 2 = C n 2 + C n 4 − n + 2 F(n) = E(n) - V(n) + 2 = C_n^2 + C_n^4 - n + 2 F(n)=E(n)V(n)+2=Cn2+Cn4n+2

F ( n ) = n 4 − 6 n 3 + 23 n 2 − 42 n + 48 24 F(n) = \\fracn^4 - 6n^3 + 23n^2 - 42n + 4824 F(n)=24n46n3+23n242n+48

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, n):
        result = n**4 - 6 * n**3 + 23 * n**2 - 42 * n + 24
        return (result // 24) % 1000000007


if __name__ == "__main__":
    n = int(input().strip())
    sol = Solution()
    result = sol.solution(n)
    print(result)

4. 开心的金明

题目

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。

今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的 N 元。

于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1-5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第 j 件物品的价格为 ##v_[j] ##,重要度为 ##w_[j] ##,共选中了 k 件物品,编号依次为 ##j_1,j_2,…,j_k## ,则所求的总和为: ##v_[j_1] imes w_[j_1]+v_[j_2] imes w_[j_2]+ …+v_[j_k] imes w_[j_k] ##。请你帮助金明设计一个满足要求的购物单。

输入描述:

输入的第1 行,为两个正整数, N m (其中N<30000 )表示总钱数,m<25 )为希望购买物品的个数。)

从第2 行到第m+1 行,第j 行给出了编号为j−1 的物品的基本数据,每行有2 个非负整数 v p (其中v 表示该物品的价格(v<=10000) ,p表示该物品的重要度(1 ~5) )

输出描述:

输出只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值()(<100000000)。

输入样例:

10 5
8 2
4 5
3 5
4 3
2 2

输出样例:

39

解题报告

动态规划,背包问题,设 f[i][j] 表示前 i 件物品不超过 n 元时所求总和最大值,则

f[i][j] = maxf[i - 1][j - vector[i][0]] + vector[i][0] * vector[i][1],其中 j >= vector[i][0]

答案为 f[N][m]

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, N, m, vector):
        f = [0] * (N + 1)
        for x, y in vector:
            for j in range(N, x - 1, -1):
                f[j] = max(f[j], f[j - x] + x * y)
        return f[N]


if __name__ == "__main__":
    arr_temp = [int(item) for item in input().strip().split()]
    N = int(arr_temp[0])
    m = int(arr_temp[1])
    vector = []
    for i in range(m):
        vector.append([int(item) for item in input().strip().split()])
    sol = Solution()
    result = sol.solution(N, m, vector)
    print(result)

以上是关于[解题报告] CSDN竞赛第18期的主要内容,如果未能解决你的问题,请参考以下文章

[解题报告] CSDN竞赛第22期

[解题报告] CSDN竞赛第22期

[解题报告] CSDN竞赛第21期

[解题报告] CSDN竞赛第21期

[解题报告] CSDN竞赛第17期

[解题报告] CSDN竞赛第20期