美团笔试3.18 题目加代码

Q1

捕获

小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。

敌人的位置将被一个二维坐标 (x, y) 所描述。

小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。

捕获的敌人之间的横坐标的最大差值不能大于A,纵坐标的最大差值不能大于B。

现在给出所有敌人的坐标,你的任务是计算小美一次性最多能使用技能捕获多少敌人。

输入描述

第一行三个整数N,A,B,表示共有N个敌人,小美的全屏技能的参数A和参数B。

接下来N行,每行两个数字x,y,描述一个敌人所在的坐标。

1≤N≤5001≤A,B≤10001≤x,y≤1000

输出描述

一行,一个整数表示小美使用技能单次所可以捕获的最多数量。

样例输入

3 1 1

1 1

1 2

1 3

样例输出

2

这题枚举左上角的点即可 笔试的时候加了绝对值方法错了 以为a了就没管 不加绝对值应该是可以的

Q2

彩带

题目描述:

小美现在有一串彩带,假定每一厘米的彩带上都是一种色彩。

因为任务的需要,小美希望从彩带上截取一段,使得彩带中的颜色数量不超过K种。

显然,这样的截取方法可能非常多。于是小美决定尽量长地截取一段。

你的任务是帮助小美截取尽量长的一段,使得这段彩带上不同的色彩数量不超过K种。

输入描述

第一行两个整数N,K,以空格分开,分别表示彩带有N厘米长,你截取的一段连续的彩带不能超过K种颜色。

接下来一行N个整数,每个整数表示一种色彩,相同的整数表示相同的色彩。

1≤N,K≤5000,彩带上的颜色数字介于[1, 2000]之间。

输出描述

一行,一个整数,表示选取的彩带的最大长度。

样例输入

8 3

1 2 3 2 1 4 5 1

样例输出

5

lc常规滑动窗口

n, k = map(int, input().split())
*nums, = map(int, input().split())
cnt = 0 
from collections import defaultdict 
hm = defaultdict(int) 
l = r = 0 
res = 0
while r < len(nums):
    hm[nums[r]] += 1
    if hm[nums[r]] == 1:
        cnt += 1
    while cnt > k:
        hm[nums[l]] -= 1
        if hm[nums[l]] == 0:
            cnt -= 1
        l += 1
    res = max(res, r - l + 1)
    r += 1
print(res)

Q3

回文串

时间限制: 3000MS

内存限制: 589824KB

题目描述:

现在小美获得了一个字符串。小美想要使得这个字符串是回文串。

小美找到了你。你可以将字符串中至多两个位置改为任意小写英文字符’a’-‘z’

你的任务是帮助小美在当前制约下,获得字典序最小的回文字符串。

数据保证能在题目限制下形成回文字符串。

注:回文字符串:即一个字符串从前向后和从后向前是完全一致的字符串。

例如字符串abcba, aaaa, acca都是回文字符串。字符串abcd, acea都不是回文字符串。

输入描述

一行,一个字符串。字符串中仅由小写英文字符构成。

保证字符串不会是空字符串。

字符串长度介于 [1, 100000] 之间。

输出描述

一行,一个在题目条件限制下所可以获得的字典序最小的回文字符串。

样例输入

acca

样例输出

aaaa

分类讨论即可

s = input().split()[0]
s = list(s)
l = 0 
r = len(s) - 1
res = 2
tmp = []
while l < r:
    if s[l] != s[r]:
        tmp.append([l,r])
    l += 1
    r -= 1
if len(tmp) == 2:
    s[tmp[0][0]] = min(s[tmp[0][0]],s[tmp[0][1]])
    s[tmp[0][1]] = min(s[tmp[0][0]],s[tmp[0][1]])
    s[tmp[1][0]] = min(s[tmp[1][0]],s[tmp[1][1]])
    s[tmp[1][1]] = min(s[tmp[1][0]],s[tmp[1][1]])
elif len(tmp) == 1:
    c = min(s[tmp[0][0]],s[tmp[0][1]])
    if c != 'a':
        s[tmp[0][0]] = 'a'
        s[tmp[0][1]] = 'a'
    else:
        s[tmp[0][0]] = 'a'
        s[tmp[0][1]] = 'a'
        if len(s) % 2 == 1:
            s[len(s) // 2] = 'a'
else:
    l = 0
    r = len(s) - 1
    cnt = 2
    while cnt > 0 and l <= r:
        if s[l] != 'a':
            s[l] = 'a'
            s[r] = 'a'
            cnt -= 2
        l += 1
        r -= 1
print("".join(s))

Q4

商店

题目描述:

现在商店里有N个物品,每个物品有原价和折扣价。

小美想要购买商品。小美拥有X元,一共Y张折扣券。

小美需要最大化购买商品的数量,并在所购商品数量尽量多的前提下,尽量减少花费。

你的任务是帮助小美求出最优情况下的商品购买数量和花费的钱数。

输入描述

第一行三个整数,以空格分开,分别表示N,X,Y。

接下来N行,每行两个整数,以空格分开,表示一个的原价和折扣价。

1≤N≤100, 1≤X≤5000, 1≤Y≤50,每个商品原价和折扣价均介于[1,50]之间。

输出描述

一行,两个整数,以空格分开。第一个数字表示最多买几个商品,第二个数字表示在满足商品尽量多的前提下所花费的最少的钱数。

样例输入

3 5 1

4 3

3 1

6 5

样例输出

2 5

两个三维dp,python三维度会tle,压缩到二维即可

n, x, y = map(int, input().split())
nums = []
for _ in range(n):
    a, b = map(int, input().split())
    nums.append([a, b])

dp = [[0] * (y + 1) for _ in range(x + 1)]
for i in range(1, n + 1):
    for j in range(x, -1, -1):
        for k in range(y, -1, -1):
            if j >= nums[i - 1][0]:
                dp[j][k] = max(dp[j][k],dp[j - nums[i - 1][0]][k] + 1)
            if j >= nums[i - 1][1] and k != 0:
                dp[j][k] = max(dp[j][k],dp[j - nums[i - 1][1]][k - 1] + 1)
mx = dp[-1][-1]
dp = [[1 << 60] * (y + 1) for _ in range(mx + 1)]
for k in range(y + 1):
    dp[0][k] = 0 
for i in range(1, n + 1):
    for j in range(mx, - 1, - 1):
        for k in range(y, -1, -1):
            dp[j][k] = min(dp[j][k], dp[j - 1][k] + nums[i - 1][0])
            if k != 0:
                dp[j][k] = min(dp[j][k], dp[j - 1][k - 1] + nums[i - 1][1])
    
print(mx, dp[-1][-1])
#做完美团2023秋招笔试,你还好吗##笔试##春招##美团#
全部评论
不知道为啥,我第一题二维前缀和都过不了,直接开摆
3 回复 分享
发布于 2023-03-18 16:15 福建
第一题真**,写了半天没a
1 回复 分享
发布于 2023-03-18 14:18 江苏
佬,想问一下第四题求买的件数花的钱是啥思路,看不懂
点赞 回复 分享
发布于 2023-03-18 15:31 湖北
我第一题暴力,和你一样思路,没a
点赞 回复 分享
发布于 2023-03-18 13:39 北京
第一题能过吗
点赞 回复 分享
发布于 2023-03-18 13:21 湖北

相关推荐

写下这篇文章的时候,我正坐在从学校飞往北京的飞机上。就在今天,我的秋招终于算是有了结论,一共60场面试,拿到了字节百度美团等10+大厂offers,最终确认了腾讯给的机会。同时给我的这三个月,这三年以及从今天往前的所有人生做了个结。这句话写的真好,为什么这么说呢?本来挺久之前我就想写点什么,有特别多想记录的,从选择这个专业到选择这个岗位,从科研的疲惫到未来生活的期待,但总感觉这样写没个纲,乱成一团。直到我今天正式在系统中点击了三方的确认,我才突然发现这种感觉就是“不可逃避的结束”在向我走来,于是纲便有了。首先是这三个月的结果吧,或者换句话说,其实是秋招的结果。从我硕士选择了强化学习的研究方向,我就知道并不会有太多的岗位。从试错中学习,这听起来很符合人类的学习方式,但实际场景中哪来那么多试错的成本?除了游戏产业和机器人行业,我想不到特别对口的赛道,而这两个行业国内又只有寡头,让我望而生畏。整个秋招,我没法像学后端开发的同学一样投递大量的简历,我没法像学大模型的同学一样是时代的香饽饽,我只能盯着那几家公司去投,或者想方设法的在别的不太相关的算法岗上沾沾边。方向是大于努力的,但努力一定不是不重要的。秋招整体对我来说还算顺利,前文就自然变成了只有我自己懂的无病呻吟,不再赘述。从结果来说,我的秋招是非常成功的,至少我自己是满意的。命运给了我很大的惊喜,我从未想过能够在这次有多个远超期待的offer,所以我如今是心满意足。虽说很多事都是焉知非福吧,但对口的工作内容,熟悉的工作环境,我一定不会后悔。我就是这样,毕竟让我在做一百次选择也不会变,那为什么要在不可预测的未来后悔。然后是三年,三年即将过去,我的硕士生涯来到了最后一章。回想过往,我在其中反复感受井底之蛙的狭隘。从我在二十多个四点睡的凌晨产出的论文初稿开始,链式反应就这样发生了。把论文投出去,我发了一篇很长的朋友圈,那时候觉得压力真的好大,尽管其实根本没人要求我什么。那时,我第一次觉得我比本科毕业时的自己进步了太多,可以独当一面了。然后去了北京自所交流,尽管大多的时间都在修改那篇返稿的文章,但也在不一样的平台中见识了人外有人的世界。回来后,我第二次觉得自己有了很大的进步,而鄙夷去北京前的自己是如此短浅。那是11月,我开始纠结到底未来该从事开发岗还是算法岗,但时间并没有给我机会。我偷懒了,两个月根本没有做任何开发岗的准备,于是只能硬闯算法。期间只有那篇论文中了让我稍微有些自信,毕竟只有两周的理论准备时间让我心里太虚了,这甚至还算上了刷题的时间。第一面就是最想去的公司,我甚至紧张到大脑一片空白。好在后面算是有惊无险,拿到了腾讯给我的实习机会。去腾讯工作的时间是幸福的,组里氛围也很好,在公司获得的提升我觉得甚至超过了我在学校一年的量。毕竟做算法,思维的敏捷度和见识广度都是如此重要。看着同事前辈们的工作能力,和工业级的项目架构,我又一次不由得感叹曾经自己的狭隘。于是每天我只睡五小时,忙完工作忙学校,每每想到这里,我也不觉得我的成功是侥幸了。我真的建议大家离开自己舒适的环境到外面看看,鸡头或许真的不如凤尾。硕士是一个连锁反应最直接,最有力的时期。高考失利或许还能补救,考研没上岸还有第二次机会,但就业前这一年,努力就是会有回报,就一定会体现在结果中,没有侥幸。最后,也是我最想聊的。十九年的学生生涯终于快要画下句号,我其实一直觉得非常梦幻。我能回忆起每一个瞬间,有小学六年级遇到的很有个性的数学老师,有考上重点中学的快乐,有中考和提前高考而大失败的难受,有本科比赛的每个通宵的焦虑,有保研出现差错的绝望,有刚读研高压之下的崩溃。但这篇长文不会再有更多的剧情了,每个故事都让我无限回味,成为了我一生中最宝贵的财富。这些瞬间组成了我。我父亲说我是一个总抓不住机会的人,确实有很多别人没有的机会摆在我面前,我都错过了。但我心中的热爱始终没有错过,我觉得这对我来说是幸运且幸福的。我非常爱打游戏,从初中开始学编程,第一个目的就是做出属于自己的游戏,做了很多小游戏发在班级群里,被人厌烦。高中自己买了unity的书,想做自己的游戏,无奈连网络的基本知识都不懂,无功而返。到了大学,我又被强化学习吸引,我想知道能不能让人工智能来帮我打游戏呢?这一整条线我没有放弃过,拿到了游戏算法offer,我真的特别特别开心。人不是一直成功的,我经历过的失败远超过成功10倍,但那让我知道成功来之不易,让我知道失败是生活常态,让我知道真正的怯懦不是不敢失败,而是不敢尝试。言尽于此,这些都“不可逃避的结束”了。追风赶月莫停留,平芜尽处是春山。
肖先生~:追风赶月莫停留,平芜尽处是春山,passion!
我的秋招日记
点赞 评论 收藏
分享
评论
22
68
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务