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

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

1. 豚鼠排名榜

题目

已知字符A.B,C。每个字符都有自己的权值q。 现不知道权值q,只知道A,B,C的三次比较结果。

输入描述:

输入三个字符串表示三次比较的结果

输出描述:

输出结果,如果不存在输出”Impossible”

输入样例:

A<B
B>C
C>A

输出样例:

ACB

解题报告

模拟,假设 x < y 则构建 x -> y 的有向边,

显然若存在结果 x < y < z,则 x 的出度为 2,y 的入度、出度均为 1,z 的入度为 2

出度用负数表示,入度用正数表示,则 3 个点的度为 -1, 0, 1

用输入的比较结果统计并比较即可

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

    def solution(self, exp1, exp2, exp3):
        d = {'A': 0, 'B': 0, 'C': 0}
        for e in [exp1, exp2, exp3]:
            if e[1] == '<':
                d[e[0]] -= 1
                d[e[2]] += 1
            else:
                d[e[0]] += 1
                d[e[2]] -= 1
        if len(set(d.values())) < 3:
            return 'Impossible'
        return ''.join(sorted(d.keys(), key=lambda x: d[x]))


if __name__ == "__main__":
    exp1 = input().strip()
    exp2 = input().strip()
    exp3 = input().strip()
    sol = Solution()
    result = sol.solution(exp1, exp2, exp3)
    print(result)

2. 字符串转换

题目

已知一个字符串a,b。 字符串b中包含数量不等的特殊符号“.”,“*”(字符串存在没有特殊符号或者全由特殊符号组成的情况)。 “.”表示该字符可以变成任意字符,“* ”表示该字符的前一个字符可以变成任意多个。 现在我们想知道b可否通过特
殊符号变成a。 a* 可以转化为a,aa,aaa,aaaa…

输入描述:

两行字符串

输出描述:

yes/no

输入样例:

aa
a*

输出样例:

yes

解题报告

模拟,正则表达式判断

import re


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

    def solution(self, a, b):
        if b.startswith('*'):
            return 'no'
        g = re.search(b, a)
        if g and g.group() == a:
            return 'yes'
        return 'no'


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

3. 蚂蚁家族

题目

小蚂蚁群是一个庞大的群体,在这个蚂蚁群中有n只小蚂蚁 ,为了保证所有蚂蚁在消息传送的时候都能接收到消息,需要在他们之间建立通信关系。就是要求小蚂蚁都可以通过多只或者直接联系到其他人。 已知几条小蚂蚁之间有通信关系,请问还需要再新建至少多少条关系?

输入描述:

第一行输入整数n,m;n为小蚂蚁总数;m为关系数。(1<=n,m<=1000)
以下m行每行m对整数x,y。(代表x与y有联系)

输出描述:

输出最少需要新建关系数。

输入样例:

4 3
1 2
2 3
3 4

输出样例:

0

解题报告

图论。用并查集统计有多少个连通块,块数减一即所需新建关系数,注意点的标号可能大于 n

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

    def getf(self, x):
        if self.f[x] == x or self.f[x] == 0:
            return x
        return self.getf(self.f[x])

    def solution(self, n, m, vector):
        self.f = [i for i in range(n + 2)]
        v = set()
        for x, y in vector:
            v.add(x)
            v.add(y)
            x = self.getf(self.f[x])
            y = self.getf(self.f[y])
            self.f[x] = y
        g = set()
        for i in v:
            self.f[i] = self.getf(i)
            g.add(self.f[i])
        return len(g) - 1 - len(v) + 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)

4. 小股炒股

题目

已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益(含本金)是?

输入描述:

第一行输入整数n,m。(1<=n<=1000,1<=m<=10000)
第二行输入n个整数表示某股票单股价格p。(1<=p<=1000)

输出描述:

输出小最大收益

输入样例:

2 4
3 7

输出样例:

8

解题报告

模拟,枚举在第 i 天买入第 j 天卖出,则买入股票数 x = ⌊ m / a r r [ i ] ⌋ x = \lfloor m / arr[i] \rfloor x=m/arr[i]⌋

收益为 m + ( a r r [ j ] − a r r [ i ] ) ∗ x m + (arr[j] - arr[i]) * x m+(arr[j]arr[i])x

统计并维护最大值即可

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

    def solution(self, n, m, arr):
        s = m
        for i, a in enumerate(arr):
            x = int(m / a)
            z = m - a * x
            for j in range(i + 1, n):
                b = arr[j]
                s = max(s, z + b * x)
        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])
    arr = [int(item) for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(n, m, arr)
    print(result)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值