第十四届蓝桥杯模拟赛第二场第一期(python题解)下

编程题

第一题

问题描述
  小蓝正在拷贝一份文件,他现在已经拷贝了 t 秒时间,已经拷贝了 c 字节,文件总共有 s 字节.如果拷贝是匀速进行的,请问小蓝大概还需要拷贝多少秒?
输入格式
  输入一行包含三个整数 t, c, s,相邻两个整数之间用一个空格分隔。
输出格式
  输出一个整数,表示答案。数据保证答案正好是整数。
样例输入
3 10 20
样例输出
3
样例输入
30 14 21
样例输出
15
评测用例规模与约定
  对于 50% 的评测用例,1 <= t, c, s <= 10000。
  对于所有评测用例,1 <= t, c, s <= 1000000000。

 简单的数学问题。注意输出答案为整数。

t, c, s = map(int, input().split())
time = (s-c)/(c/t)
print(int(time))

第二题

问题描述
  小蓝有 n 个单词,但是单词中有一些是重复的,请帮小蓝去除重复的单词。
输入格式
  输入第一行包含一个正整数 n ,表示小蓝的单词数量。
  接下来 n 行,每行包含一个由小写字母组成的单词。
输出格式
  请输出去除重复后的那些单词。如果一个单词出现了多遍,请保留第一次出现的单词,去除之后出现的单词,按输入的顺序输出。
样例输入
5
lanqiao
hi
hello
hello
lanqiao
样例输出
lanqiao
hi
hello
评测用例规模与约定
  对于所有评测用例,1 <= n <= 100,每个单词的长度不超过 100。

本题输入数据后,按顺序输出,在输出时判断当前字符串是否输出过,没有出现过则输出该数据,否则跳过,再在标志列表中存下当前的字符串。

lst_voc = []
lst_sign = []
num = int(input())
for i in range(num):
    lst_voc.append(input())
for i in lst_voc:
    if i not in lst_sign:
        print(i)
        lst_sign.append(i)

 第三题

问题描述
  一个字符串如果从左向右读和从右向左读相同,则称为一个回文串,例如 lanqiaoaiqnal 是一个回文串。
  小蓝有一个字符串,请将这个字符串右边加上一些字符,使其成为一个回文串。
  如果有多种方案,请输出最短的回文串。
输入格式
  输入一行包含一个字符串,由小写英文字母组成。
输出格式
  输出一行包含答案。
样例输入
lanqiao
样例输出
lanqiaoaiqnal
样例输入
banana
样例输出
bananab
样例输入
noon
样例输出
noon
评测用例规模与约定
  对于所有评测用例,1 <= 字符串长度 <= 100。

本题的关键点:向右端加上字符串,成为回文串。即从右末端向左找出最大的回文子串。然后将前面剩余的部分逆序加在字符串末尾。

# 检验回文串
def check(low, high, s):
    while low < high:
        if s[low] != s[high]:
            break
        low += 1
        high -= 1
    if low == high or s[low] == s[high]:
        return True
    return False


string = input()
length = len(string)
sign = length - 1
for i in range(length):
    if check(i, length - 1, string):
        sign = i
        break
for j in range(sign - 1, -1, -1):
    string = string + string[j]
print(string)

第四题 

问题描述
  给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个45度斜线方向引出的直线段组成,四条线段的长度相同,而且四条线段上的字母和中心点的字母相同。
  一个 X图形可以使用三个整数 r, c, L 来描述,其中 r, c 表示中心点位于第 r 行第 c 列,正整数 L 表示引出的直线段的长度。 对于 1 到 L 之间的每个整数 i,X图形满足:第 r-i 行第 c-i 列与第 r 行第 c 列相同,第 r-i 行第 c+i 列与第 r 行第 c 列相同,第 r+i 行第 c-i 列与第 r 行第 c 列相同,第 r+i 行第 c+i 列与第 r 行第 c 列相同。
  例如,对于下面的字母矩阵中,所有的字母 L 组成一个 X图形,其中中间的 5 个 L 也组成一个 X图形。所有字母 Q 组成了一个 X图形。
  LAAALA
  ALQLQA
  AALQAA
  ALQLQA
  LAAALA
  给定一个字母矩阵,请求其中有多少个 X图形。
输入格式
  输入第一行包含两个整数 n, m,分别表示字母矩阵的行数和列数。
  接下来 n 行,每行 m 个大写字母,为给定的矩阵。
输出格式
  输出一行,包含一个整数,表示答案。
样例输入
5 6
LAAALA
ALQLQA
AALQAA
ALQLQA
LAAALA
样例输出
3
评测用例规模与约定
  对于 50% 的评测用例,1 <= n, m <= 10。
  对于所有评测用例,1 <= n, m <= 100。

 本题类似于第一期模拟赛全相等三角形。使用暴力即可。首先确定X型的中间点,然后检验中间点外圈的四个字母,都相等再依次向外检验四个字母。注意:外圈字母的坐标不要越界。

扫描二维码关注公众号,回复: 17281592 查看本文章

# 存字母矩阵
N = 120
a = [[0] * N for _ in range(N)]
n, m = map(int, input().split())
for i in range(1, n + 1):
    a[i][1:m + 1] = list(input())


# 检查相对位置字母
def check(i, j, delta_x, delta_y, length):
    center = a[i][j]
    x, y = i, j
    for _ in range(length):
        x = x + delta_x
        y = y + delta_y
    if x < 1 or x > m or y < 1 or y > n:
        return False
    if a[x][y] != center:
        return False
    return True


# 暴力求解
res = 0
for i in range(1, n + 1):
    for j in range(1, m + 1):
        for k in range(1, min(n, m) // 2 + 1):
            if check(i, j, -1, -1, k) and check(i, j, -1, 1, k) and check(i, j, 1, -1, k) and check(i, j, 1, 1, k):
                res += 1
print(res)

第五题

问题描述
  小蓝有一个序列 a[1], a[2], ..., a[n],每次可以交换相邻的两个元素,代价为两个元素中较大的那个。
  请问,要通过交换将序列变为从小到大递增的序列,总代价最少为多少?
输入格式
  输入一行包含一个整数 n ,表示序列长度。
  第二行包含 n 个整数,表示给定的序列。
输出格式
  输出一行包含一个整数,表示最少代价的值。
样例输入
4
1 5 2 1
样例输出
12
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 1000, 1 <= a[i] <= 1000。
  对于 60% 的评测用例,1 <= n <= 50000, 1 <= a[i] <= 50000。
  对于所有评测用例,1 <= n <= 1000000, 1 <= a[i] <= 1000000。

 归并排序的板子,只不过这里不是求解逆序对的数量,而是求每个逆序对中较大的那个值的和。因为最后是要求非严格的递增序列,因此一定不会存在逆序对,那么就可以通过不断交换逆序对中的两个元素,来实现序列递增的效果。

def lowbit(x):
    return x & -x

# 树状数组更新
def update(x, d):
    while x <= L:
        tree[x] += d
        x += lowbit(x)

# 树状数组求和
def getsum(x):
    res = 0
    while x:
        res += tree[x]
        x -= lowbit(x)
    return res

n = int(input())
a = list(map(int, input().split()))[::-1]  # 翻转数组,解决数组求和的问题
res = 0
L = max(a)  # 取最大的数构建树状数组
tree = [0] * (L + 1)
for i in range(n):
    update(a[i], 1)
    cnt = getsum(a[i] - 1)
    res += cnt * a[i]
print(res)

感谢观看!!!

祝每天收获满满!!!

猜你喜欢

转载自blog.csdn.net/ygs_0827/article/details/128067583