20220914米哈游笔试题解

T1

米小游拿到了一个字符串,她想截取一个连续子串,使得该子串中包含至少k个连续的“mihoyo”。你可以帮米小游求出最短的子串长度,以及对应的子串位置吗?
输入描述:
第一行输入两个正整数n和k,用空格隔开。
第二行输入一个长度为n的、仅由小写字母组成的字符串。
1≤k≤n≤200000
输出描述:
如果不存在这样一个连续子串,请输出-1。
否则输出两个正整数l,r,代表选取的子串的左下标和右下标(整个字符串左下标为0,右下标为n-1)。
请务必保证选择的连续子串包含至少k个"mihoyo",且长度是最短的。有多解时输出任意即可。

input:
22 2
mihoyoyomihoyomimihoyo

output:
0 13

维护所有"mihoyo"字符串出现的位置,计算任意连续k个位置的最短就可以了。

n, k = map(int, input().split())
s = input()
a = []
start = 0
t = 'mihoyo'
while True:
    i = s.find(t, start)
    if i == -1: break
    a.append(i)
    start = i + 1
ans = float('inf')
ansl, ansr = 0, 0

if len(a) >= k:
    for i in range(len(a) - k + 1):
        l = a[i]
        r = a[i + k - 1] + 5
        if r - l + 1 < ans:
            ans = r - l + 1
            ansl, ansr = l, r

if ans == float('inf'): print(-1)
else: print(ansl, ansr)

T2

米小游心中想了一个正整数,她邀请了n个人来猜这个数。每个人会猜一个数ai,然后米小游会告诉对方猜的结果:大于等于米小游想的数(≥)或者小于米小游想的数(<)。
猜谜结束后,米小游统计了共有x个≥和y个<。请你判断米小游初始想的数有多少种不同的可能?

输入描述:
第一行输入一个正整数n,代表猜谜的人数。
第二行输入n个正整数ai,代表每个人猜的数字。
第三行输入两个整数x和y,用空格隔开。
1≤x+y=n≤1e5
1 ≤ ai ≤ 1e9
输出描述:
如果有无穷多种可能,输出"infinity"
否则输出一个整数,代表米小游心中想的数的不同可能数量。

input:
3
1 5 3
0 3

output:
infinity

因为题目数据保证满足要求,那么把a数组排序。表示>=的必然是前面几个,表示<的必然是后面几个。

什么时候会出现infinity?就是每一个数都输出大于的时候。因为说了是正整数,如果全是<,下层最小值是1,是有限的。

唯一的坑点,数据的代表>=的x和代表<的y写反了……把这两个数据调过来就可以过100%。

n = int(input())
*a, = map(int, input().split())
x, y = map(int, input().split())
a.sort()

if x == 0:
    print('infinity')
else:
    if y:
        l = a[y - 1]
    else:
        l = 1
    r = a[y]
    print(r - l)

T3

米小游有一棵有根树,树上共有n个节点。
米小游指定了一个节点x为根,然后定义所有相邻的、编号奇偶性相同的节点为一个连通块。米小游想知道,所有子树(共有n个子树)的连通块数量之和是多少?
举个例子:

图片说明

如上图,3号节点被指定为根
然后3-1-5作为一个连通块,4号节点和2号节点为单独的连通块。
那么1号节点到5号节点,每个节点的子树连通块数量分别为:2、1、3、1、1,总连通块数量是8。

input:
5 3
1 2
1 3
3 4
5 1

output:
8

经典自底向上递归。以某节点为根的子树的贡献=所有子树贡献和-与该节点奇偶性相同的子节点数量。

import sys

sys.setrecursionlimit(int(2e5))

n, x = map(int, input().split())
g = [[] for _ in range(n + 1)]
for _ in range(n - 1):
    u, v = map(int, input().split())
    g[u].append(v)
    g[v].append(u)


def solve():
    ret = 0

    def dfs(cnt, pre):
        ans = 1
        for nxt in g[cnt]:
            if nxt == pre: continue
            ans += dfs(nxt, cnt)
            if (cnt & 1) == (nxt & 1): ans -= 1
        nonlocal ret
        ret += ans
        return ans

    dfs(x, -1)
    return ret


print(solve())
#米哈游##笔试##米哈游笔试##米哈游23秋招笔试心得体会#
全部评论
第一题只过了25,思路是一样的,人麻了😅
1 回复
分享
发布于 2022-09-14 22:17 江苏
第三题我感觉写的没问题 但是提交0% 不知道为啥啊
点赞 回复
分享
发布于 2022-09-14 22:02 美国
联易融
校招火热招聘中
官网直投
啊啊啊啊 第二题是官方的问题啊
点赞 回复
分享
发布于 2022-09-14 22:13 安徽
第二题看了半天,提交一直不过,但试了好多例子都没问题,没想到x,y是反的吗,我人傻了
点赞 回复
分享
发布于 2022-09-14 22:16 上海
请问悟空哥能不能帮我看一下第三题我的代码有什么问题吗,谢谢了
点赞 回复
分享
发布于 2022-09-14 22:27 浙江
麻了,就一道16的通过率
点赞 回复
分享
发布于 2022-09-14 23:42 广东
有没有C++版本的。。
点赞 回复
分享
发布于 2022-09-14 23:56 广东
第二题样例是不是也是错的  我记得第二题样例3是 2 2 2 1 1 怎么可能既>=2又<2
点赞 回复
分享
发布于 2022-09-15 21:00 上海
T1有个想法: mihoyo不会有头尾相接的情况,那可不可以把输入字符串所有mihoyo替换为一个符号比如@,然后找符合的情况,这样可行吗
点赞 回复
分享
发布于 2022-09-23 11:18 江苏
mark
点赞 回复
分享
发布于 2023-02-28 06:20 法国

相关推荐

17 64 评论
分享
牛客网
牛客企业服务