编程题
第一题
问题描述 小蓝正在拷贝一份文件,他现在已经拷贝了 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型的中间点,然后检验中间点外圈的四个字母,都相等再依次向外检验四个字母。注意
:外圈字母的坐标不要越界。
# 存字母矩阵 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)
感谢观看!!!
祝每天收获满满!!!