前面三个题属于基础题,第五题是并查集模板题,第四题是一个比较有意思的贪心题
7-1 在群里做复读机
【超级签到题】
输入一些正整数,将它们原样输出。
输入格式:
第一行一个正整数 T ,表示有 T 组测试数据。 接下来 T 行,每行一个正整数a 。
输出格式:
输出 T 行,每行一个正整数 a 。
输入样例1:
在这里给出一组输入。例如:
3
1
2
3
输出样例1:
在这里给出相应的输出。例如:
1
2
3
输入样例2:
1
1000000000000000000000000000000000
输出样例2:
1000000000000000000000000000000000
答案:
T = int(input())
for i in range(T):
n = input()
print(n)
7-2 在猴子前吃桃
【签到题】
这是一个编程题模板。请在这里写题目描述。例如:本题目要求读入2个整数A和B,然后输出它们的和。
一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n(n≤20) 天早上起来一看,只剩下 1 个桃子了。请问小猴买了几个桃子?
输入格式:
整数n。
输出格式:
桃子数,一个整数
输入样例:
在这里给出一组输入。例如:
4
输出样例:
在这里给出相应的输出。例如:
22
答案:
n = int(input())
s = 0
for i in range(1, n + 1):
if s == 0:
s = 1
else:
s = (s + 1) * 2
print(s)
7-3 在图书馆里做运维
图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入。为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统。
该系统需要支持 2 种操作:
add(s) 表示新加入一本书名为 s 的图书。
find(s) 表示查询是否存在一本书名为 s 的图书。
输入格式:
第一行包括一个正整数 n ,表示操作数。 以下 n 行,每行给出 2 种操作中的某一个指令条,指令格式为:
add s
find s
在书名 s 与指令(add,find)之间有一个隔开,我们保证所有书名的长度都不超过 200。可以假设读入数据是准确无误的。
输出格式:
对于每个 find(s) 指令,我们必须对应的输出一行 yes 或 no,表示当前所查询的书是否存在于图书馆内。
注意:一开始时图书馆内是没有一本图书的。并且,对于相同字母不同大小写的书名,我们认为它们是不同的。
输入样例:
在这里给出一组输入。例如:
4
add Inside C#
find Effective Java
add Effective Java
find Effective Java
输出样例:
在这里给出相应的输出。例如:
no
yes
数据范围
n<=30000
答案:
n = int(input())
nums = []
for i in range(n):
inderation = input()
nums.append(inderation)
lst = set()
for index in nums:
if index[0] == "a":
lst.add(index[4:])
elif index[0] == "f":
if index[5:] in lst:
print("yes")
else:
print("no")
7-4 在操场种树
通往操场的路被划为 n 条路段,这 n 条路段依次编号为 1...n 。每个路段最多可以种一棵树。现在居民们给出了h组建议,每组建议包含三个整数b,e,t表示居民希望在路段b 到e 之间至少要种 t棵树。这些建议所给路段的区间可以交叉。请问:如果要满足所有居民的建议,至少要种多少棵树。
输入格式:
第一行为 n,表示路段数。
第二行为 h,表示建议数。
下面 h 行描述一条建议:b,e,t用一个空格分隔。
输出格式:
输出只有一个数,为满足所有居民的建议,所需要种树的最少数量。
输入样例:
在这里给出一组输入。例如:
9
4
1 4 2
4 6 2
8 9 2
3 5 2
输出样例:
在这里给出相应的输出。例如:
5
答案:
n = int(input())
h = int(input())
nums = []
for i in range(h):
intent = tuple(map(int, input().split()))
nums.append(intent)
nums.sort(key=lambda x: x[1])
visit = [0] * (nums[-1][1] + 1)
tmp = nums[0][1]
for _ in range(nums[0][2]):
visit[tmp] = 1
tmp -= 1
for j in range(1, h):
t = nums[j][2]
if sum(visit[nums[j][0]: nums[j][1] + 1]) >= t:
continue
if nums[j][0] > nums[j - 1][1]:
for q in range(nums[j][1], nums[j][0] - 1, -1):
visit[q] = 1
t -= 1
if t == 0:
break
else:
for q in range(nums[j][0], nums[j][1] + 1):
if visit[q] == 1:
t -= 1
else:
q_index = nums[j][1]
visit[q_index] = 1
t -= 1
q_index -= 1
if t == 0:
break
print(sum(visit))
7-5 在并查集前找关系
题目描述 这是一道模板题。
维护一个 n 点的无向图,支持:
加入一条连接 u 和 v 的无向边 查询 u 和 v 的连通性
由于本题数据较大,因此输出的时候采用特殊的输出方式:用 0 或 1 代表每个询问的答案,将每个询问的答案依次从左到右排列,把得到的串视为一个二进制数,输出这个二进制数 mod 998244353 的值。
输入格式:
第一行包含两个整数 n , m ,表示点的个数和操作的数目。
接下来 m 行每行包括三个整数 op, u , v 。
如果 op = 0,则表示加入一条连接 u 和 v 的无向边;
如果 op = 1,则表示查询 u 和 v 的连通性。
输出格式:
一行包括一个整数表示答案。
输入样例:
在这里给出一组输入。例如:
3 6
1 1 0
0 0 1
1 0 1
1 1 2
0 2 1
1 2 1
输出样例:
在这里给出相应的输出。例如:
5
答案串为 0101。
数据范围与提示
n<=4000000,m<=8000000
答案:
m, n = map(int, input().split())
nums = []
for _ in range(n):
data = list(map(int, input().split()))
nums.append(data)
dic = {}
bin_CE = ""
for i in range(n):
if nums[i][0] == 0:
dic[nums[i][1]] = nums[i][2]
dic[nums[i][2]] = nums[i][1]
elif nums[i][0] == 1:
try:
if dic[nums[i][1]] == nums[i][2] or dic[nums[i][2]] == nums[i][1]:
bin_CE += "1"
except KeyError:
bin_CE += "0"
def func(s):
num = 0
j = 0
for index in s:
num += int(index) * 2 ** (len(s) - j - 1)
j += 1
return num
print(func(bin_CE) % 998244353)