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

Posted AlgoComp

tags:

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

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

1. 判断胜负

题目

已知两个字符串A, B。连续进行读入n次。每次读入的字符串都为A|B。输出读入次数最多的字符串。

解题报告

模拟,统计输出即可

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

    def solution(self, n, vector):
        d = 
        for v in vector:
            d[v] = d.get(v, 0) + 1
        a = sorted(d.items(), key=lambda x: x[1])
        if n > 1 and a[-1][1] == a[-2][1]:
            return 'dogfall'
        return a[-1][0]


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

2. 买铅笔

题目

P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋友们发礼物。现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。

解题报告

模拟,对于数量为 x,价格为 y 的一包铅笔,需要的价钱为: ⌈ n / x ⌉ ∗ y \\lceil n / x \\rceil * y n/xy

遍历并取该值的最小值即可

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

    def solution(self, n, arr):
        a = []
        for x, y in arr:
            a.append(((n - 1) // x + 1) * y)
        return min(a)


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

3. 拯救爱情

题目

小艺酱走到一个花之占卜店中。店员小Q看到小艺酱可怜的样子,允许小艺酱免费占卜一次。花瓣占卜:1.一瓣“在一起”,一瓣“不在一起”;开始的花瓣表示“在一起”。2.直到最后一个花瓣落地游戏结束。3.可以选择多朵花,选择撕一朵花就必须撕完。

解题报告

模拟,题目即求 n 个数中挑若干个数,使得这些数之和为奇数且最大,输出最大和

故先求所有数之和,若为奇数则为所求;否则减去最小的奇数

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

    def solution(self, n, arr):
        s = 0
        b = 200000
        for a in arr:
            s += a
            if a % 2 == 1:
                b = min(b, a)
        if s % 2 == 1:
            return s
        return s - b


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)

4. 拯救公主

题目

在Flower Kingdom里,住着一位美丽的公主Ana,有一天Ana得了一种怪病,神医告知国王,在遥远的幽谷中有一种药能治愈Ana,但是神医只有一份不完整的地图,地图的描述如下:该地图共有3行,第一行有m列,m为奇数,第二行有m+1列,第三行有m+2列;每一行用一个字符串表示,只有【两种字符】;‘.'表示草地,可以从它上面通过,‘’表示岩石,每一行最多一个‘’;入口在左上角,由于在对角线方向上,因此即使对角线两边都有岩石,但是缝隙较大,人可以通过,故人可以向八个方向行走;真实地图是由该地图的【每一行无限循环】得到的,这种神奇的药草就生长在第x行第y列的草地上,药草可能会在岩石上;国王决定派遣勇敢的骑士David前去寻找拯救公主的解药;现在聪明的你是否知道David能否找到该药?

解题报告

数学,由于每行最多只有一个岩石,故只有以下两种情况输出 NO:

  • 解药这格是岩石
  • 解药左方存在一列三行均为岩石

遍历地图求出三行岩石位置 x, y, z(若无 3 个岩石且不是第一种情况则直接输出 YES)
枚举第一行周期性位置 s = x + m * i,若 s < y 且 (s - y) % (m + 1) = 0 且 (s - z) % (m + 2) = 0 则说明存在一列三行均为岩石,输出 NO
枚举到 s >= y 时结束,输出 YES

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

    def solution(self, arr, vec):
        m, x0, y0 = arr
        x0 -= 1
        y0 -= 1
        if vec[x0][y0 % (m + x0)] == '*':
            return 'NO'
        a = []
        for v in vec:
            for j, c in enumerate(v):
                if c == '*':
                    a.append(j)
        if len(a) < 3:
            return 'YES'
        for i in range(1000000000):
            x = a[0] + m * i
            if x > y0:
                return 'YES'
            if (x - a[1]) % (m + 1) > 0:
                continue
            if (x - a[2]) % (m + 2) > 0:
                continue
            return 'NO'
        return 'YES'


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

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

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

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

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

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

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

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