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

Posted lijiancheng0614

tags:

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

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

这次写完第一道题时遇到一个奇怪的情况:一直在 运行中,然后发现每道题输入做任意代码都出现一直运行中。

跟小助手沟通后退出重新打开就可以运行了,但总耗时统计了之前花费的时间。

希望系统可以稳定一些吧,尽量不浪费时间,不影响体验和心情。

1. 计数问题

题目

试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9) 共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。

输入描述:

2个整数 n,x , 之间用一个空格隔开。

输出描述:

1 个整数,表示 x 出现的次数。

输入样例:

11 1

输出样例:

4

解题报告

模拟,遍历 1 到 n 并解析每一位数,统计即可

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

    def solution(self, n, x):
        s = 0
        for i in range(1, n + 1):
            m = i
            while m:
                if m % 10 == x:
                    s += 1
                m = m // 10
        return s


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

2. 小艺的英文名

题目

小艺酱想给自己起一个英文名字。 小艺酱想要装的自己学识渊博。 所以她想要自己英文名字必须满足: 1.只有字母表中前k个小写字母。 2.必须是回文串。 3.前k个小写字母每个字母至少出现一次。 小艺酱已经自己完成了部分空余的字母部分用’?’代替。 请你帮她完成她的英文名字。

输入描述:

第一行输入一个整数k。(1<=k<=26) 第二行输入小艺酱的英文名字name。(1<=strlen(name)<=1000)

输出描述:

如果小艺的名字不存在输出“QAQ”, 如果存在多组解,输出字典序最小的一个解。

输入样例:

2
a??a

输出样例:

abba

解题报告

模拟,统计前 k 个小写字母中未出现的字母集合,倒序准备好

从中间向两端处理以保证字典序最小,设当前位置为 i,长度为 n,则对称位置为 n - i - 1

若位置 i 不为 ?,则
若位置 n - i - 1 不为 ? 且不相等则 QAQ,若为 ? 则位置 n - i - 1 填入 name[i]

若位置 i 为 ?,则
若位置 n - i - 1 不为 ? 则位置 i 填入 name[n - i - 1],否则填入集合中的字母,若集合中的字母都用完了,填 a 即可

最后判断候选集合是否用完,若没用完则 QAQ,否则输出填好的字符串

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

    def solution(self, k, name):
        n = len(name)
        m = (n - 1) // 2
        ans = [name[i] for i in range(n)]
        v = set(name)
        a = []
        for i in range(k - 1, -1, -1):
            x = chr(ord('a') + i)
            if x not in v:
                a.append(x)
        s = 0
        for i in range(m, -1, -1):
            if ans[i] != '?':
                if ans[n - i - 1] != '?' and ans[i] != ans[n - i - 1]:
                    return 'QAQ'
                if ans[n - i - 1] == '?':
                    ans[n - i - 1] = ans[i]
                    continue
            if ans[n - i - 1] != '?':
                ans[i] = ans[n - i - 1]
                continue
            if s >= len(a):
                ans[i] = ans[n - i - 1] = 'a'
                continue
            ans[i] = ans[n - i - 1] = a[s]
            s += 1
        if s < len(a):
            return 'QAQ'
        return ''.join(ans)


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

3. 蛇形矩阵

题目

给你一个整数n,输出n∗n的蛇形矩阵。

输入描述:

输入一行,包含一个整数n

输出描述:

输出n行,每行包含n个正整数,通过空格分隔。

输入样例:

4

输出样例:

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

解题报告

模拟,按对角线填入数字即可

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

    def solution(self, n):
        s = 1
        m = 1
        a = [[0 for j in range(n)] for i in range(n)]
        while s <= n * n:
            i = m - 1
            j = 0
            while i >= 0 and j < m:
                if i < n and j < n:
                    a[i][j] = s
                    s += 1
                i -= 1
                j += 1
            m += 1
            i = 0
            j = m - 1
            while i < m and j >= 0:
                if i < n and j < n:
                    a[i][j] = s
                    s += 1
                i += 1
                j -= 1
            m += 1
        return [' '.join(map(str, a[i])) for i in range(n)]


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

4. 放货物

题目

小明是一名快递员,他现在手上一共有N个快件需要运送。但是货车有限,所以我们希望用最少的货车来进行工作。现在已知,一辆车的限定额度为最多放置K件货物。此外,小明很不喜欢13这个数字,所以他不希望任何一辆货车中的货物数量为13。 现在小明想要知道,最少使用多少辆货车能够将这N个快件都放置到货车上。

输入描述:

题目包含多组输入,每一组输入一行两个数,分别表示N 和 K 1<=N<=1000 1<=K<=1000

输出描述:

输出一行一个数字,表示最优结果。

输入样例:

13 13
5 2

输出样例:

2
3

解题报告

模拟,货车尽可能少时需要将货车尽可能装满

若 k < 13,答案为 n / k + int(n % k > 0)

若 k = 13,由于不能装 13 个快件,故只能每辆车装 12 个,答案为 n / 12 + int(n % 12 > 0)

若 k > 13,则装完 n / k 辆车后需要判断是否还剩下快件且快件数是否为 13,若为 13 且不能跟前一辆车匀(即 k == 14),答案为 n / k + int(n % k > 0) + int(k == 14 and n % k == 13)

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

    def solution(self, arr_temp):
        ans = []
        for arr in arr_temp:
            if len(arr) < 2:
                continue
            n, k = arr
            s = 0
            if k < 13:
                s = n // k + int(n % k > 0)
            elif k == 13:
                s = n // 12 + int(n % 12 > 0)
            else:
                s = n // k + int(n % k > 0) + int(k == 14 and n % k == 13)
            ans.append(str(s))
        return ans


if __name__ == "__main__":
    sol = Solution()
    data = []
    while True:
        try:
            arr_temp = [int(item) for item in input().strip().split()]
            data.append(arr_temp)
        except:
            break
    result = sol.solution(data)
    print("\\n".join(result))

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

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

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

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

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

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

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