当前位置: 首页 > 面试经验 >

美团8.20算法岗笔试

优质
小牛编辑
104浏览
2023-03-28

美团8.20算法岗笔试

1.定位


'''
题目描述:
小团在地图上放了三个定位装置,想依赖他们来进行定位!
小团的地图是一个n×n的一个棋盘,他在(x1,y1),(x2,y2),(x3,y3) xi,yi ∈ Z ∩ [1,n] 这三个位置分别放置了一个定位装置(两两不重叠)。
然后小团在一个特定的位置(a,b)a,b ∈ Z ∩ [1,n]放置了一个信标。每个信标会告诉小团它自身到那个信标的曼哈顿距离,即对i=1,2,3 小团知道(|xi-a|+|yi-b|),
现在小团想让你帮他找出信标的位置!注意,题目保证最少有一个正确的信标位置。
因为小团不能定位装置确定出来的信标位置是否唯一,如果有多个,输出字典序最小的那个。(a,b)的字典序比(c,d)小,当且仅当 a<c或者a==c∧b<d

第一行一个正整数n,表示棋盘大小。

第二行两个整数,分别表示x1与y1,即第一个定位器的位置。

第三行两个整数,分别表示x2与y2,即第二个定位器的位置。

第四行两个整数,分别表示x3与y3,即第三个定位器的位置。

第五行三个整数,分别表示第一、二、三个定位器到信标的曼哈顿距离。第i个定位器到信标的曼哈顿距离即(|xi-a|+|yi-b|)

数字间两两有空格隔开,对于所有数据, n≤50000,  1≤xi,yi≤n

'''
n = int(input())
x1, y1 = map(int, input().strip().split())
x2, y2 = map(int, input().strip().split())
x3, y3 = map(int, input().strip().split())
dis1, dis2, dis3 = map(int, input().strip().split())
hash1, hash2, hash3 = dict(), dict(), dict()
for i in range(1, n+1):
    for j in range(1, n+1):
        if abs(i-x1)+abs(j-y1) == dis1:
            hash1[(i,j)] = 1
        if abs(i-x2)+abs(j-y2) == dis2:
            hash2[(i,j)] = 1
        if abs(i-x3)+abs(j-y3) == dis3:
            hash3[(i,j)] = 1
# res = dict()
resdict = dict(hash1.items() & hash2.items() & hash3.items())
common = []
for key, val in resdict.items():
    # for i in range(0, val):
    common.append(key)
x, y = common[0]
print(x,y)

2.复习

'''
小美即将进行期末考试!小美现在盘算了一下,一共有n道试题,对于第 i 道试题,小美有着pi的概率做对,获得ai的分值,
另外(1-pi)的概率做错,获得0分。小美的总分即是每道题获得的分数之和。小美不甘于此!她决定突击复习,因为时间有限,
她最多复习m道试题,使得复习后的试题正确率提升到100%。小美想知道,如果她以最佳方式进行复习,能获得的期望总分最大是多少。
输入描述
第一行两个正整数n和m,表示总试题数和最多复习试题数。

接下来一行n个整数,分别为p1 p2...pn,表示小美有pi%的概率,即pi=pi/100的概率做对第i个题。(注意,这里为了简单起见,将概率pi扩张100倍成为整数pi方便输入)

接下来一行n个整数,分别表示a1 a2...an,分别表示第 i 个题做对的分值。

数字间两两有空格隔开,对于所有数据,1≤m≤n≤50000,0≤pi≤100,1≤ai≤1000

输出描述
输出一行一个恰好两位的小数,表示能获得的最大期望总分。(如果答案为10应输出10.00,2.5应输出2.50)
'''
n, m = map(int, input().strip().split())
num1 = list(map(int, input().strip().split()))
num2 = list(map(int, input().strip().split()))
# print(num1)
path = 0
hashmap = dict()
for i in range(n):
    hashmap[num1[i]] = num2[i]
hashmap = sorted(hashmap.items(), key=lambda kv:(100-kv[0])*kv[1], reverse=True)
res = 0
# print(hashmap[0][1])
for i in range(len(hashmap)):
    if i<m:
        res += 100*hashmap[i][1]
    else:
        res += hashmap[i][0]*hashmap[i][1]
res /= 100
print('%.2f'%res)

3.烤串

'''
题目描述:
 小团想要自己来烤串!不过在烤串之前,需要串好烤串。小团有n个荤菜和n个素菜,他想按顺序分别一个荤菜一个素菜串起来,想请你帮他串好!
给出两个长度分别为n的仅包含小写英文字母的串A和B,分别代表荤菜和素菜的种类(用字母来表示菜的种类)。请你以从左到右的顺序依次串好他们!例如对于荤菜串A1A2...An
和素菜串B1B2...Bn,串好应该是A1B1A2B2...AnBn

输入描述
第一行一个正整数n,表示烤串长度

第二行为一个长度为n的字符串A,表示荤菜按次序都是哪些菜。

第三行为一个长度为n的字符串B,表示素菜按次序都是哪些菜。

对于80%的数据,n≤1000

对于20%的数据,n≤50000

对于所有数据,A和B为仅包含小写英文字母的字符串。

输出描述
输出一行,包含2n个字符串表示串好的烤串。
'''
n = int(input())
str1 = list(map(str, input().strip()))
str2 = list(map(str, input().strip()))
i1, i2 = 0, 0
res = ''
while i1<n and i2<n:
    res += str1[i1]
    i1 += 1
    res += str2[i2]
    i2 += 1
print(res)

4.拟合

'''
小团生日收到妈妈送的两个一模一样的数列作为礼物!他很开心的把玩,不过不小心没拿稳将数列摔坏了!现在他手上的两个数列分别为A和B,
长度分别为n和m。小团很想再次让这两个数列变得一样。他现在能做两种操作,操作一是将一个选定数列中的某一个数a改成数b,
这会花费|b-a|的时间,操作二是选择一个数列中某个数a,将它从数列中丢掉,花费|a|的时间。小团想知道,他最少能以多少时间将这两个数列变得再次相同!

输入描述
第一行两个空格隔开的正整数n和m,分别表示数列A和B的长度。

接下来一行n个整数,分别为A1 A2...An

接下来一行m个整数,分别为B1 B2...Bm

对于所有数据,1≤n,m≤2000, |Ai|,|Bi|≤10000

输出描述
输出一行一个整数,表示最少花费时间,来使得两个数列相同。
'''
n, m = map(int, input().strip().split())
arr1 = list(map(float, input().strip().split()))
arr2 = list(map(float, input().strip().split()))
times = 0
i1, i2 = 0, 0
while i1<len(arr1) and i2<len(arr2):
    if abs(arr2[i2]-arr1[i1]) < abs(arr2[i2])+abs(arr2[i1]):
        times += abs(arr2[i2]-arr1[i1])
        i1 += 1
        i2 += 1
    else:
        times += abs(arr2[i2])+abs(arr2[i1])
        arr1.pop(i1)
        arr2.pop(i2)

print('%.0f'%times)

#美团笔试##算法工程师##秋招##做完美团2023秋招笔试,你还好吗#
 类似资料: