算法赛解析

第一题:喜鹊罢工

题目描述:

七夕节到了,牛郎织女一年一度的浪漫相会也即将到来。然而,天庭最近实施了一项不合理的政策--“加班不给加班费”,这导致喜鹊们纷纷罢工,拒绝参与搭建连接银河两岸的鹊桥。

面对这样的困境,织女决定采取行动,她打算用自己的巧手编织出美丽的彩虹丝巾来搭建一座天桥,以确保与牛郎的约会能够如期进行。

已知每条彩虹丝巾的长度都是精确的7米,而银河的宽度则是365米。在织女精湛的编织技艺下,每条丝巾与下一条丝巾的连接部分可以巧妙的融合,几乎不产生任何长度上的损失。现在,请你计算,织女至少需要编织多少条彩虹丝巾,才能成功跨越银河,与牛郎相聚。

输出格式:

输出一个整数。

print(int(53))

第二题:牛郎取名

题目描述:

什么?牛郎织女竟然有孩子了?是的,在经过了一年一度的鹊桥相会后,他们的爱情终于开花结果。为了给孩子取一个名字,牛郎翻遍了典籍,最终决定从织女精心准备的字符锦囊中按照特定的顺序选取所有字符来命名。这个锦囊一共包含了n个小写字符 ,可以表示为s = s1s2...sn,牛郎冥思苦想后,决定了选择顺序,记为p = p1p2...pn,并计划从织女的字符锦囊中按顺序分别取出第p1,p2个字符,按顺序组成新的名字。

例如,锦囊里的字符是abcd,牛郎选择了第3、1、2、4个字符,那么孩子的名字就是cabd。

现在,牛郎将选取规则告诉你,请你帮他算出最终会组成什么样的名字吧。

输入格式:

第一行输入一个正整数n(1 <= n <= 10^5),表示字符锦囊中字符的数量。

第二行输入一个长度为n,仅包含小写字母的字符串s,表示字符锦囊中的字符。

第三行输入n个整数p1,p2,...,pn,(1 <= pi <= n,pi互不相同),表示选取字符的顺序。

输出格式:

输出一行一个字符串,表示最终组成的名字。

# 读取锦囊中字符的个数
n = int(input())

# 读取锦囊中的字符串
s = input()

# 读取选取字符的顺序
pi_list = list(map(int, input().split()))

# 根据选取顺序提取字符并组成新字符串
result = ''.join([s[i-1] for i in pi_list])

# 输出最终组成的名字
print(result)

第三题:织女的考验

题目描述:

七夕节即将到来,七夕城热闹非凡,牛郎想邀请美丽的织女一同前往七夕城漫步。

织女并不想轻易地接受牛郎的邀约,于是向他提出了一个有趣的字符串问题:

给定两个长度相等的小写字符串s和t,牛郎需要判断是否可以从s和t中各删除一个字符,使得删除后的s经过重新排列后等于t,若可以则输出YES,否则输出NO。

输入格式:

输入一个整数t,表示询问的数量,1 <= t <= 10^3。

接下来t行,每行输入两个 小写字符串s和t(1 <= |s|,|t| <= 10^3)表示一次询问。

输出格式:

输出t行,每行一个字符串表示答案。

import os
import sys

# 请在此输入您的代码
from collections import Counter
def main():
    s,t = map(str,input().split())
    c1 = Counter(s)
    c2 = Counter(t)
    cnt = 0
    for k,v in c1.items():
        cnt += max(0,v - c2[k])
    if cnt <= 1:
        print("YES")
    else:
        print("NO")

t = int(input())
for _ in range(t):
    main()

第四题:仙男仙女

题目描述:

七夕佳节,银河之上,鹊桥横跨,牛郎织女相会。

今年的鹊桥格外热闹,因为不仅织女翘首以盼,更有n位美丽的单身仙女来到了这里,希望能邂逅属于自己的幸福。

为了方便区分,每位仙女都被分配了一个唯一的编号,分别为1、2、...、n。由于仙女数量众多,鹊桥上显得拥挤不堪。我们可以把鹊桥看作一条笔直的天河,仙女i位于天河上的坐标pi处。有些心急的仙女可能会挤到同一个坐标上,期盼着早日遇到心仪的对象。

为了维持秩序,同时也为了给仙女们创造一个良好的相亲环境,鹊桥的管理者决定制定一个规则:每个仙女都需要保持一个安全距离。具体来说,对于仙女i,月老会根据她的魅力值设定一个安全距离ai,只有当仙女i周围ai的距离(即[pi - ai,pi + ai])内没有其他仙女时,她才能安心地完成脱单。

请你帮他算一下,会有多少人脱单。

输入格式:

第一行包含一个整数n(1 <= n <= 10^5)表示仙女的数量。

第二行包含n个整数pi(1 <= pi <= 10^9),表示每位仙女在鹊桥上的坐标。

第三行包含n个整数ai(1 <= ai <= 10^9),表示每位仙女的安全距离。

输出格式:

输出一个整数,表示答案。

import os
import sys

# 请在此输入您的代码
import sys

n = int(input())
w = [[0, 0] for _ in range(n)]
p = list(map(int, input().split()))
a = list(map(int, input().split()))

if n == 1:
    print(1)
    sys.exit()

for i in range(n):
    w[i][0] = p[i]
    w[i][1] = a[i]

w.sort()

cnt = 0
ok = 1

for i in range(n - 1):
    d = w[i + 1][0] - w[i][0]
    if d > w[i][1] and ok:
        cnt += 1
    if d <= w[i + 1][1]:
        ok = 0
    else:
        ok = 1

if d > w[-1][1]:
    cnt += 1

print(cnt)

第五题:牛郎的微信群

题目描述:

在现代社会,随着通讯技术的快速发展,牛郎和织女不再依赖每年七夕才能相见,他们可以通过微信每年保持联系。

玩转微信的牛郎还建立了一个微信群,群里的成员都是帮助过他们的喜鹊。

现在已知这个群里共有n个成员,编号为1,2,...,n,成员之间共有n - 1对朋友关系,这些关系形成了一棵树的结构。

为了更好地组织交流,牛郎想请你帮忙计算出每个成员的“朋友的朋友”的数量。具体来说,对于每个成员1,2,...,n,请你计算出与该成员的距离为2的其他成员的数量(“距离”是指树中两个成员之间直接相连的边的数量)。

输入格式:

第一行包含一个整数n( 2 <= n <= 2 * 10^5),表示微信群成员的数量。

接下来n - 1行,每行包含两个整数u和v(1 <= u,v <= n,u != v),表示成员u和v之间存在朋友关系。

输出格式:

输出一行,包含n个整数。第i个整数表示成员i的“朋友的朋友”的数量。

import os
import sys

# 请在此输入您的代码
from collections import defaultdict

def main():
    n = int(input())
    degree = [0] * n
    answer = [0] * n
    graph = defaultdict(list)
    
    for _ in range(n-1):
        u, v = map(int, input().split())
        u -= 1
        v -= 1
        graph[u].append(v)
        graph[v].append(u)
        degree[u] += 1
        degree[v] += 1
    
    for i in range(n):
        answer[i] = -degree[i]
        for v in graph[i]:
            answer[i] += degree[v]
    
    for i in range(n):
        print(answer[i], end=" " if i < n-1 else "\n")

if __name__ == "__main__":
    main()

第六题:久别重逢

题目描述:

每年的七月初七,本是牛郎织女鹊桥相会的甜蜜时刻。但在今年,状况突发,这对分别已久的恋人重逢时竟然产生了一丝陌生,致使两人的亲密度降为0。

为了重新点燃亲密度,他们决定通过一次次的约会来提高亲密度,但是亲密度不能超过n。他希望每次约会后,亲密度至少能够提高k。

现在,请你计算出“在每次亲密度至少提高k但亲密度不能超过n”的前提下,亲密度可以有多少种不同的变化过程。因为答案较大,需对10^9 + 7取余。

输入格式:

输入仅一行,包含两个整数n(1 <= n <= 10^5)和k(1 <= k <= n),分别表示亲密度上限和每次约会后至少会提升的亲密度值。

输出格式:

输出一个整数表示答案。

mod = 10**9 + 7
n, k = map(int, input().split())

dp = [0] * (n + 1)
dp[0] = 1
sum_p = 0
for i in range(1, n + 1):
    if i >= k:
        dp[i] = (dp[i-1] + dp[i-k]) % mod

print((sum(dp)) % mod)

ok,这篇就写到这里。 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值