第一题
问题描述 小蓝正在拷贝一份文件,他现在已经拷贝了 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)