美团笔试3.18 题目加代码
Q1
捕获
小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。
敌人的位置将被一个二维坐标 (x, y) 所描述。
小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。
捕获的敌人之间的横坐标的最大差值不能大于A,纵坐标的最大差值不能大于B。
现在给出所有敌人的坐标,你的任务是计算小美一次性最多能使用技能捕获多少敌人。
输入描述
第一行三个整数N,A,B,表示共有N个敌人,小美的全屏技能的参数A和参数B。
接下来N行,每行两个数字x,y,描述一个敌人所在的坐标。
1≤N≤500,1≤A,B≤1000,1≤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秋招笔试,你还好吗##笔试##春招##美团#
快手公司福利 1244人发布