【CSDN周赛第38期】Python题解

这次题目不怎么难,基本上都在周赛中出现过,python代码附上。

一.代谢写匿名信

这个没有全过,有一个没过,得分率9/10,检查的时候反过来检查刚刚好检查到这里就没检查了就没发现。所以不知道是什么情况过不了。

题目描述
小Q想要匿名举报XX领导不务正业!小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。 现在小Q找来了报纸,和自己的举报信的Txt, 你能帮他确定下是否能够完成匿名信吗?
输入描述:
第一行输入报纸上的英文。 第二行输入小Q匿名信的内容。 (1<=len(str)<=10000)
输出描述:
如果能完成输出”Yes”,否则输出”No” (区分大小写,不考虑空格)
示例
示例1
输入
Asdadsadas dsadas
das
输出
Yes
class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, words, msg):
        result = None
        # TODO: 请在此编写代码
        d = {}
        for i in msg:
            d[i] = 0
        for i in msg:
            d[i] += 1
        for i in words:
            if i in d and d[i] > 0:
                d[i] -= 1
        if sum(d.values()) == 0:
            result = 'Yes'
        else:
            result = 'No'
        return result


if __name__ == "__main__":
    words = input().strip()
    msg = input().strip()
    sol = Solution()
    result = sol.solution(words, msg)
    print(result)

二.寻因找祖

题目描述
寻找因子个数为n的最小整数x
输入描述:
输入整数n。(1<=n<=1000)
输出描述:
输出x。
示例1
输入 3
输出 4
class Solution:
    def __init__(self) -> None:
        import math
        self.log = 1e10
        self.a = [0 for i in range(1000)]
        self.x = int()
        self.p = [2,3,5,7,11,13,17,19,23,29,31,37,39,41,43]
        self.l = [math.log(x) for x in self.p]
        pass
    def dfs(self, d, n, m, y):
        if y > self.log:
            return 0
        if n == 1:
            self.log = y
            self.x = 1
            for i in range(d):
                self.x *= self.p[i] ** self.a[i]
            return 0
        for i in range(1, m+1):
            if i*i > n:
                break
            if n % i == 0:
                if i > 1:
                    self.a[d] = i - 1
                    self.dfs(d+1, n/i, i, y+self.l[d]*(i-1))
                if n / i <= m and n / i != i:
                    self.a[d] = int(n/i) - 1
                    self.dfs(d+1, i, int(n/i), y+self.l[d]*(n/i-1))
    def solution(self, n):
        result = None
        # TODO: 请在此编写代码
        self.dfs(0, n, n, 0)
        result =self.x
        return result
if __name__ == "__main__":
    n = int(input().strip())
    sol = Solution()
    result = sol.solution(n)
    print(result)

三.小Q新式棋盘

题目描述
已知棋盘大小为n*n。 每个位置都有自己的权值q。 该棋盘中有多少对行权值和小于列权值和。
输入描述:
第一行输入整数n。(1<=n<=100)表示棋盘的大小 以下n行每行输入n个整数表示棋子的权值。(1<=a<=1000)
输出描述:
输出小Q的分值。
示例1
输入:
3
1 2 3
1 2 3
1 2 3
输出:
3
示例2
输入:
3
5 7 8
4 5 3
1 6 6
输出:
4
class Solution:

    def __init__(self) -> None:
        pass

    def solution(self, n, vector):
        result = None
        # TODO: 请在此编写代码
        sum_r = [sum(i) for i in vector]
        sum_c = [0 for i in range(n)]
        for i in range(n):
            for j in range(n):
                sum_c[i] += vector[j][i]
        sum_r.sort()
        sum_c.sort()
        sum_r = sum_r[::-1]
        sum_c = sum_c[::-1]
        sum_c.append(0)
        result = 0
        i = 0
        j = 0
        while i < n:
            if sum_r[i] >= sum_c[j]:
                result += j
                i += 1
            else:
                j += 1
        return result


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)

四.拯救公主

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

    def solution(self, arr, vec):
        result = None
        # TODO: 请在此编写代码
        m, x, y = arr
        rocks = [y, y, y]
        for i in range(3):
            for j in range(m+i):
                if vec[i][j] == '*':
                    rocks[i] = j+1
                    break
        if (y-rocks[x-1]) % (m+x-1) == 0:
            return 'NO'
        tmp = []
        up = min(y, m*(m+1)*(m+2))
        while rocks[2] < up:
            tmp.append(rocks[2])
            rocks[2] += m+2
        for i in range(1,-1,-1):
            new_tmp = []
            while rocks[i] < up:
                if rocks[i] in tmp:
                    new_tmp.append(rocks[i])
                rocks[i] += m+i
            tmp = new_tmp
        if new_tmp:
            result = 'NO'
        else:
            result = 'YES'
        return result


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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_小豫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值