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

Posted lijiancheng0614

tags:

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

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

1. 圆小艺

题目

最近小艺酱渐渐变成了一个圆滑的形状-球! !
小艺酱开始变得喜欢上球!
小艺酱得到n个同心圆。
小艺酱对着n个同心圆进行染色。
相邻的圆范围内不能有相同的颜色。 相隔一层的圆颜色相同。
小艺酱想知道圆最外层的那种颜色全部染了多少?

输入描述:

第一行输入整数n.(1<=n<=1000)表示圆的数量。
第二行输入n个圆的半径。(1<=r<=1000)

输出描述:

输出染色面积,保留小数点后3位。

输入样例:

3
1 2 3

输出样例:

18.849

解题报告

模拟,先从大到小排序,然后遍历累加(偶数次)或累减(奇数次)面积即可

import math


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

    def solution(self, n, arr):
        arr = sorted(arr, reverse=True)
        s = 0
        for i, a in enumerate(arr):
            if i % 2 == 0:
                s += a * a
            else:
                s -= a * a
        result = math.pi * s
        return ':.3f'.format(result)


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

2. K皇把妹

题目

存在n个节点, 目标节点在m。
每个节点有自己的权值a。
在权值k内(含k值) 选择一个权值非0节点且与目标节点距离最近。
节点i与节点j的距离为abs(i-j)。

输入描述:

第一行输入整数n,m,k.(1<=n,m,k<=100)
第二行输入n个整数的权值。(1<=a<=1000)

输出描述:

输出最小距离

输入样例:

7 3 50
62 0 0 0 99 33 22

输出样例:

3

解题报告

模拟,遍历判断权值 k 内、非 0 且非目标节点,维护最小值即可

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

    def solution(self, n, m, k, arr):
        s = n + 1
        m -= 1
        for i in range(n):
            if arr[i] <= k and arr[i] > 0 and i != m:
                s = min(s, m - i)
        return s


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

3. 筛选宝物

题目

已知存在n个宝物, 每个宝物都有自己的质量m和价值v, 在考虑选择宝物时只能选择总质量小于等于M的方案, 请问在最优方案下选择宝物, 能获取到最大价值V是多少?

输入描述:

第一行输入宝物的数量n(1<n<100)和可选择宝物的总质量M(0<=M<=1000)。
以下n行每行输入两个数m和v(1<m<100, 1<v<100),表示这n个宝物其各自的重量和价值。

输出描述:

输出最优方案下能获取的最大价值V。
说明:

v代表每个宝物自己的价值

m代表每个宝物的质量

V代表最大价值

M代表总质量

输入样例:

5 10
2 3
5 3
4 5
6 2
4 2

输出样例:

10

解题报告

动态规划。经典背包问题

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

    def solution(self, n, M, vector):
        f = [0 for j in range(M + 1)]
        for v in vector:
            for j in range(M, v[0] - 1, -1):
                f[j] = max(f[j], [j - v[0]] + v[1])
        return f[M]


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(n):
        vector.append([int(item) for item in input().strip().split()])
    sol = Solution()
    result = sol.solution(n, M, vector)
    print(result)

4. 圆桌

题目

有N个客人与足够多张的圆桌。 主人安排每位客人坐在一个圆桌边, 但是每位客人希望自己左右边上分别有一些空座位,不然会觉得害羞。 注意, 如果一个客人所在的圆桌只有他一个人, 那么他左边的空座位数量就是他右边的空座位数量。
试问主人需要准备多少个座位, 才能让每个客人舒适的坐下。

输入描述:

第一行输入一个整数N,(1<=N<=10000),代表客人的数量
接下来N行,每行两个整数li与ri,(1<=i<=N,1<=li<=ri<=1000000000)
代表第i位客人希望左边有li个空座位,右边有ri个空座位。

输出描述:

输出一个整数,代表主人需要准备的最少座位数量。

输入样例:

3
1 1
1 1
1 1

输出样例:

6

解题报告

贪心,椅子数最少即尽可能使两人之间公用的座位最多。
故对 l[i] 和 r[i] 分别进行排序,由于每个人本身还需要一个座位,故答案为 n + maxl[i], r[i]

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

    def solution(self, n, vector):
        l = sorted([v[0] for v in vector])
        r = sorted([v[1] for v in vector])
        s = n
        for i in range(n):
            s += max(l[i], r[i])
        return s


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

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

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

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

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

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

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

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