美团8.20笔试,python解法及思路
第一题,烤串
给定2个字符串,AB,依次输出A1B1A2B2...一直到末尾
签到题,直接一次遍历,放入新字符串
n = int(input().strip()) l1 = list(map(str,input().strip().split())) l2 = list(map(str,input().strip().split())) res = '' for i in range(n): res = res+ str(l1[0][i])+str(l2[0][i]) print(res)
第二题
地图上放了3个定位装置,地图是一个n*n的棋盘,有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内,在(a,b)位置放了一个信标,定位装置会告诉到信标的曼哈顿距离,求信标位置,信标不唯一,输出字典序最小的。
input:
3
21
22
23
212
output:
12
这个题我只过了73%,是枚举了每个定位装置的符合距离的点位集合,三个集合求交集,提示是空间复杂度超了
n = int(input().strip()) ding1 = list(map(int, input().strip().split(' '))) ding2 = list(map(int, input().strip().split(' '))) ding3 = list(map(int, input().strip().split(' '))) dis = list(map(int, input().strip().split(' '))) def mhd(n, r, x,y): res = [] for i in range(r+1): x1 = x +i x2 = x-i y1 = y+r-i y2 = y -(r-i) if x1<=n and x1>0 and y1<=n and y1>0: res.append([x1,y1]) if x1<=n and x1>0 and y2<=n and y2>0: res.append([x1,y2]) if x2<=n and x2>0 and y1<=n and y1>0: res.append([x2,y1]) if x2<=n and x2>0 and y2<=n and y2>0: res.append([x2,y2]) return res ans1 = mhd(n,dis[0],ding1[0],ding1[1]) ans2 = mhd(n,dis[1],ding2[0],ding2[1]) ans3 = mhd(n,dis[2],ding3[0],ding3[1]) ans12 = [] ans = [] for i in ans1: if i in ans2: ans12.append(i) for j in ans3: if j in ans12: ans.append(j) ans.sort() print(str(ans[0][0])+' '+str(ans[0][1]))
第三题
期中考试,有n道题,对于第i道题,有pi的几率做对,获得ai的分值,还有(1-pi)的概率做错,得0分。
总分是每道题获得的分数之和。
因为时间有限,最多复习m道题,复习后的试题正确率为100%。
如果以最佳方式复习,能获得期望最大总分是多少?
做法是求每道题做错丢的分数,丢的越多,复习这道题,得到的分数就越多,注意保留两位小数,不保留只能过27%,快结束才检查出来这个问题
nm = list(map(int,input().strip().split(' '))) p = list(map(int,input().strip().split(' '))) score = list(map(int,input().strip().split(' '))) true_score = [] for i in range(len(p)): true_score.append([(1-p[i]/100)*score[i],score[i]]) true_score.sort(reverse=1) res = 0 for j in range(len(p)): if j<nm[1]: res = res + true_score[j][1] else: res = res + true_score[j][1]-true_score[j][0] print(round(float(res),2)
第四题
收到妈妈送的两个一模一样的数列作为礼物,但是不小心没拿稳将数列摔坏了,现在手上的两个数列分别为A和B,长度分别为m。现在能做两种操作:
操作一:将一个选定数列中的某一个数a改成数b,这会花费|b-a|的时间
操作二:选择一个数列中某个数a,将它从数列中丢掉,花费a的时间。
最少能以多时间将这两个数列变得再次相同?
编辑距离,看大佬说python可能超时
第五题
火箭有一些地方坏了,为了修补一个地方,需要使用材料压着,有很多种这样的材料。
火箭上有n个地方坏了,每个地方至少需要bi单位重量的材料压住
有m种材料,每种材料重量为ai
同时要求:一个地方只能使用一个材料,材料需要尽量小。
分别对n和m进行排序,然后遍历n和m,m只需要从上一次的开始遍历即可,从头遍历的话会超时
nm = list(map(int, input().strip().split(' '))) ni = list(map(int, input().strip().split(' '))) mi = list(map(int, input().strip().split(' '))) res = 0 ni.sort() mi.sort() temp = 0 for i in range(len(ni)): flag = 0 for j in range(temp, len(mi)): if mi[j] >= ni[i]: res = res + mi[j] temp = j flag = 1 break else: continue if flag == 1: continue else: break if flag == 1: print(res) else: print(-1)