没进国赛就不能学国赛知识了?

没进国赛就不能学国赛知识了?

做一下算法赛题目。

第一题:银色情人节

题目描述:
七月的阳光炙热灿烂,智慧的火花闪耀天际。7.14银色情人节,是传递爱意的美好时光。

分享甜蜜,珍藏浪漫。正是彼此的真心相伴,才有了我们温馨美满的情感。

让我们用心感受爱情的美好,开启浪漫的甜蜜之旅,用真情温暖心灵,用爱书写未来。

对此,请你输出7.14,共享甜蜜时刻。

输入格式:

本题为填空题,无需输入即可作答。

输出格式:

输出一个字符串。

print('7.14')

第二题:书籍标签

题目描述:

小蓝,一位热爱读书的青年,常常沉浸在书的世界里。

这天在他逛书店的时候, 发现书店里的每一类书籍都有一定的库存数量,而且部分书籍还被贴上了特别的标签。这些标签往往是一些负面评价,比如“印刷存在错误”或者“页码混乱”等等。

小蓝仔细观察了每个书架,并记录下了每类书籍的库存总数以及被贴特别标签的数量。现在,他需要你的帮助来分析这些数据,找出哪一类书籍被贴上特别标签的比例最低,即从该书籍中随机选择一本时,拿到带有特别标签的书籍的概率最小。

输入格式:

输入的第一行包含一个整数N(1 <= N <= 10^5),表示书籍的类别数量。

接下来的N行,每行包含两个整数ti和pi(1 <= pi <= ti <= 100),分别表示第i类书籍的库存总数和被贴特别标签的数量。

输出格式:

输出一个整数,表示被贴特别标签比例最低的书籍类别的索引(索引从1开始)。如果有多个答案,则输出索引值最小的那个。

思路:

(1)先预设最大比例和最小索引,然后遍历所有的比例,不断比较,找出最小的那个,然后输出它的索引就行。

n = int(input())
min_ratio = float('inf')  # 初始化最小比例为无穷大
min_index = -1  # 初始化最小比例对应的索引为-1

for i in range(n):
    t, p = map(int, input().split())
    ratio = p / t  # 计算比例
    if ratio < min_ratio:
        min_ratio = ratio
        min_index = i + 1  # 索引从1开始

print(min_index)


(2)说到索引,也可以用列表的思想,将比例所对应的索引和数值代入,然后用一个匿名函数自定义排序即可。

n = int(input())
a = []
for i in range(n):
  ti,pi = map(int,input().split())
  a.append((i + 1,pi / ti))
a.sort(lambda x:x[1])
print(a[0][0])

第三题:帕鲁服务器崩坏

题目描述:

“那个帕鲁我已经观察你很久了,我对你是有些失望的,进了这个营地,不是把事情做好就可以的,你需要有体系化思考的能力。”

幻兽帕鲁火遍全网,成为了一款现象级游戏。

猫猫作为顶级帕鲁自然是首当其冲搭好了游戏私服,叫上好兄弟开始了愉快私服开荒。

但是这个游戏好玩归好玩,服务器有一堆bug。比如说众所周知的内存泄露问题。猫猫很无奈,写了一个脚本去检测服务器的内存占用问题,当超过一定数值就自杀。

但是问题又来了,服务器自杀了之后还要猫猫亲自去动手重启,配置守护进程的诸多方法都不合适最终,猫猫决定一分钟监听一次服务器端口是否正常放通。并记录下日志。

具体如下:脚本每隔一分钟监听一次服务端口是否正常,如果服务没有正常运行,则输出1并重启服务,否则输出0。

现在日志形如一段01字符串,0代表正常运行,1代表端口关闭。在定时任务监听中遇到端口关闭时会自动重启一次服务器。

现在拿到日志之后,猫猫想知道[l,r)区间内到底有多少次重启成功。(l为起点时刻,r为终点时刻)

注:重启成功为服务从端口关闭状态转换为端口正常运行状态。如果日志的最后一分钟为1,那么你可以视为最后一分钟为重启失败。

输入格式:

第一行输入一个正整数n。(1 <= n <= 2 * 10^5)

第二行输入一个长度为n的01字符串s(|s| = n,si属于{0,1},1 <= i <= n) 。

第三行输入一个正整数m(1 <= m <= 2 * 10^5)

接下来m行,每行输入两个正整数l、r,表示区间[l,r)。(1 <= l <= r <= n + 1)

输出数据:

输出m行,表示对于m次查询的结果。

思路:

(1)读取日志字符串的长度n,并获取日志字符串s本身;

(2)代码初始化一个列表sum,其长度为n + 1,用于存储每个区间内重启成功的次数。列表中的每个元素表示从第一分钟到第i分钟内重启的次数;

(3)使用循环来填充列表sum,循环从第一分钟开始,到第n分钟结束。在每次迭代中,代码检测当前分钟s[i]和前一分钟s[i - 1]的日志状态。如果当前分钟是“0”且上一分钟是“1”,这意味着服务器在这分钟内重启成功了,因此sum[i]加1;

(4)由于最后一个区间的终点是n + 1,所以sum[n] = sum[n - 1],以确保最后一个查询的结果也是正确的;

(5)接下来就是读取查询次数m,并使用一个循环来处理每个查询;

(6)在每个查询中,代码计算并输出区间[l,r)内重启成功的次数,这是通过计算sum[r - 1] - sum[l - 1]来实现的。sum[l - 1]表示到区间起点为止的重启成功次数,sum[r - 1]表示到区间终点为止的重启成功次数。两者之差就是区间[l,r)内的重启成功次数。这里用到的是前缀和思想。

n = int(input())
s = input()
sum1 = [0] * (n + 1)
for i in range(1,n):
  sum1[i] = sum1[i - 1]
  if s[i] == "0" and s[i - 1] == "1":
    sum1[i] += 1
sum1[n] = sum1[n - 1]
m = int(input())
for _ in range(m):
  l,r = map(int,input().split())
  print(sum1[r - 1] - sum1[l - 1])
  
  


好了,我只会3题,另外3题还在思考,这篇就写到这里,下一篇继续! 

07-16 11:34