第五届“传智杯”全国大学生计算机大赛(练习赛)传智杯 #5 练习赛] 前四题Python解答

第一道题:

给定若干个字符串,不定数量,每行一个。有些字符串可能出现了多次。
如果读入一个字符串后,发现这个字符串以前被读入过,则这个字符串被称为前面相同的字符串的复读,这个字符串被称为复读字符串。
相应的,每个首次出现的字符串就是非复读字符串

输入格式:
    输入多个字符串,每行一个,含义见题目描述。
    注意:如果这个字符串是 0,说明所有字符串都读完了。这个 0 不认为是一个“非复读字符串”
输出格式:
    共一行,表示所有非复读字符串,按照行号从小到大依次连接的结果
例如输入:
    abc
    def
    abc
    abc
    abc
输出:
    abcdef
#这题比较简单
strs = []
while True:
    a = input()
    if a == '0':
        break
    if a not in strs:
        strs.append(a)
for i in strs:
    print(i, end='')

第二道题:

第一题:
你有一个电子钟,可以显示 0:00 到 23:59 之间的所有时间,以数字的形式显示。
其中小时是 0 到 23(0 时会显示一个 0,而 1 到 9 时不会显示前导 0),分钟是 00 到 59(0 到 9 分都会显示前导 0)。
任何时刻,电子钟都会显示三个或者四个 00 到 99 的数字。如果在某时刻,这些数字依次组成了一个等差数列,则这个时刻被称为“好时刻”。

你感觉很无聊,从 0:00 时刻开始盯着这个电子钟。一共盯了 xx 分钟。请问整个过程中,"好时刻"来临了多少次(算上开头和结尾)?

输入格式:一个非负整数。

输出格式:请输出"好时刻"来临了多少次?

输入输出样例
输入:120 输出 :10
输入 :2880  输出 :79
输入 :987654321  输出 :26748975
time = int(input())  # 输入观察时长
count = time // 1440 * 39  # 一天共1440分钟,好时刻共有39次
time = time % 1440
for i in range(0, time + 1):
    a = i // 60
    b = (i - a * 60) // 10
    c = i - a * 60 - b * 10
    d = 0
    if a > 9:
        d = a // 10
        a = a % 10
    if d != 0:
        if c - b == b - a == a - d:
            count += 1
    if d == 0:
        if a + c == 2 * b:
            count += 1
print(count)

第三题:

你有 n 件道具可以买,其中第 i 件的价格为 a_i.

你有 w 元钱。你仅能用钱购买其中的一件商道具。当然,你可以拿你手中的道具换取其他的道具,只是这些商道具的价值之和,
不能超过你打算交换出去的道具。你可以交换无数多次道具。道具的价值可能是 0,但是你不能使用空集换取价值为 0 的商品。
请问,在这个条件下,最多可以换取多少件道具?

输入格式
第一行一个正整数 n,表示道具个数。

接下来一行 n 个正整数,分别表示 a_i道具的价格。

接下来一行 1 个正整数,表示 w。

输出格式
一个正整数,表示答案。

输入输出样例
输入:
3
1 1 2
5
输出
2
说明/提示
【样例解释】

买价值为 2 的道具,并交换为两个价值为 1 的道具。
objectnumbers = int(input())
objectmoneys = []
count = 0
for i in range(objectnumbers):
    objectmoney = int(input())
    objectmoneys.append(objectmoney)
money = int(input())
objectmoneys = sorted(objectmoneys, reverse=True)
for i in objectmoneys:
    if money >= i:
        maxobject = i
        objectmoneys.remove(i)#防止进行自我交换
        break
for i in objectmoneys:
    if maxobject >= i and maxobject != 0:
        maxobject -= i
        count += 1
print(count)

第四题:


题目描述
有一个 n\times n×n 的地块,一个连续 i 分钟没人经过的地面在第 i 分钟会落上 i 个单位的灰,
有人经过时不会落灰但灰也不会清零,在人走后第一分钟又会落上一个单位的灰,以此类推。
你在这个 n\times nn×n 的范围内移动,你的移动轨迹可以描述为一个由 {N,S,W,E}组成的字符串,
每个字母分别表示上、下、左、右。这个人一开始在点 (x,y),每一分钟移动一步。
求最后每一个位置上落下的灰的量。

本题中的上和右分别表示 y 轴正方向和 x 轴正方向。保证你没有超过移动的范围。

输入格式
第一行四个正整数 n,m,x,y含义如题面所示,其中 x,y 表示横纵坐标,不是数组下标。
第二行一个长度为 m 的字符串,表示你的移动序列。

输出格式
共n 行,每行 n 个数,第 i 行的第 j 个数表示坐标 (j,n-i+1)上的灰的数量

输入输出样例
输入
5 4 1 1
NENW
输出
10 10 10 10 10
10 10 10 10 10
10 6 10 10 10
4 4 10 10 10
6 10 10 10 10
输入
7 14 1 1
NENENENENESSSS
输出
105 105 105 105 105 105 105
105 105 105 105 55 61 105
105 105 105 49 51 69 105
105 105 51 49 105 79 105
105 61 55 105 105 91 105
79 69 105 105 105 105 105
91 105 105 105 105 105 105
输入
10 70 2 2
NWSNSNNNSNNSSNNSENNNNEESNWSESESSWENNSEWESWWWESEEESENNSENWNESNWSNNNEESS
输出
2485 2485 2485 2485 2485 2485 2485 2485 2485 2485
2485 1407 1205 1267 2485 2485 2485 2485 2485 2485
2485 1435 1281 1167 2485 2485 2485 2217 2281 2347
2485 1465 2485 1255 1041 2485 2485 2155 2485 2415
1557 1497 2485 2485 969 1177 2485 1733 1807 2485
1471 1531 1315 907 935 1267 2485 1473 1647 2485
1631 2485 2485 1357 1381 1407 1435 1499 1645 2485
2021 2347 2485 2485 2485 2485 1465 1497 2485 2485
2087 2415 2485 2485 2485 2485 2485 2485 2485 2485
2485 2485 2485 2485 2485 2485 2485 2485 2485 2485
输入
5 4 2 1
NENW
输出
10 10 10 10 10
10 10 10 10 10
10 10 6 10 10
10 4 4 10 10
10 6 10 10 10
说明/提示
本题 y 轴朝上,x 轴朝右,样例输出中的左下角表示 (1,1)(1,1),第一分钟你在初始点处,
第二分钟移动到相应的位置,第 m+1 分钟移动到最后一个点,但是总共只有 m 分钟,因此最后一个点不受移动的影响

样例 1 解释:

你的移动路径为(1,1)→(1,2)→(2,2)→(2,3)→(1,3),共 4分钟。

对于第 1 分钟,(1,1) 灰层数不变,其余点被落下了 1 层灰。

对于第 2 分钟,(1,2) 灰层数不变,(1,1) 被落下了 1 层灰,其余点落下 2 层灰。

对于第 3 分钟,(2,2) 灰层数不变,(1,1)落下 2 层灰,(1,2) 落下 1 层灰,其余点落下 3 层灰。

对于第 4 分钟,(2,3 灰层数不变,(1,1) 落下 3 层灰,(1,2) 落下 2 层灰,(2,2) 落下 1 层灰,其余点落下 4 层灰。

注意最后你移动到了 (1,3),但是时间只有 4 分钟,所以实际上不会对 (1,3) 造成影响。初始点不一定在 (1,1)。
stones, times, start_x, start_y = list(map(int, input().split(' ')))
go = input()
index_x = stones - start_y  # 将坐标系坐标转换为数组下标
index_y = start_y - 1
dust = [[i for j in range(stones)] for i in range(stones)]  # 定义二维列表
for i in range(stones):  # 二维列表赋初值为0,表示当前灰尘数为0,后期记录灰尘总数
    for j in range(stones):
        dust[i][j] = 0
cleaner = [[i for j in range(stones)] for i in range(stones)]  # 同理,后期记录每分钟地砖落灰尘数
for i in range(stones):
    for j in range(stones):
        cleaner[i][j] = 0


def timecleanerdust(index_x, index_y):  # 求出当前时间段(每分钟)应该落灰数目
    for i in range(stones):
        for j in range(stones):
            cleaner[i][j] += 1  # 每分钟在原基础上加1
    cleaner[index_x][index_y] = 0  # 重置清洁工走过的地砖的落灰数目


def alldust():  # 累加灰尘总数
    for i in range(stones):
        for j in range(stones):
            dust[i][j] += cleaner[i][j]


def indexwhere(goes, index_x, index_y):  # 根据方向goes更新坐标
    if goes == 'W':
        index_y -= 1
    elif goes == 'S':
        index_x += 1
    elif goes == 'N':
        index_x -= 1
    else:
        index_y += 1
    return index_x, index_y


for i in range(0, times):
    goes = go[i]  # 提出移动方向
    timecleanerdust(index_x, index_y)  # 根据清洁工坐标得出地砖该时间内落尘数目
    index_x, index_y = indexwhere(goes, index_x, index_y)  # 更新坐标并返回坐标值
    alldust()  # 加和灰尘数目
for i in range(stones):  # 输出答案
    for j in range(stones):
        print(dust[i][j], end=' ')
    print('')

因为是大一新生第一次参加竞赛能力有限,第五六题这里就不予列出了,如果代码有不妥之处,望各位大佬不吝赐教!谢谢


版权声明:本文为weixin_73226367原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。