2022/3/12 【暑期实习】美团笔试
B站上有一些大佬的讲解,下面有些代码就是参考写的:https://www.bilibili.com/video/BV1GY41137FP
1、包含1
判断数字是否至少满足以下两个特征的一种:
(1)数字是11的整倍数
(2)数字中至少包含两个1
是输出“yes”,不是输出“no”
输入
3 13 113 1212
输出
no
yes
yes
在C++里面可以逐位求模,算出最后一个判断是否为1,找出所有的1,和条件(2)去比较。
if __name__=="__main__": n = int(input()) for _ in range(n): tmp = input() if int(tmp)%11 == 0 or tmp.count('1') >= 2: print("yes") continue print("no")
2、连续序列乘积
现在有一个序列,序列中仅包含1和-1的两种数字。小美现在想要知道,有多少个连续子序列,序列中的数字乘积为正。n≤5000。
输入
4 1 1 -1 -1
输入
6
偶数的-1,5000支持n^2,前缀和的思想好理解
pre = [0]*5005 if __name__=="__main__": n = int(input()) ans = [0] tmp = list(map(int, input().split())) ans.extend(tmp) for i in range(1, n+1): pre[i] = pre[i-1]+(ans[i] == -1) res = 0 for i in range(1, n+1): for j in range(i, n+1): if(pre[j]-pre[i-1])%2 == 0: res+=1 print(res)
方法二: 这种思想比较巧妙,类似于滑动窗口
1 tmp = 1 2 if __name__=="__main__": 3 n = int(input()) 4 ans = list(map(int, input().split())) 5 ans.append(1) 6 res = 0 7 for i in range(n): 8 flag = tmp 9 tmp*=ans[i] 10 for k in range(i,n): 11 flag = flag*ans[k]*ans[k-i-1] 12 if flag == 1: 13 res += 1 14 print(res)
3、点菜
小美现在在厨房做饭,小美发现食材刚好只够每种菜做一份。现在同一时刻(即不分先后顺序)来了n个顾客。
每个顾客都有自己想到两份要点的菜。只有当顾客吃到全部自己想要的菜的时候,顾客才会满意。
现在你的任务是,合理地接取顾客的订单要求,尽可能让更多用户满意,并输出最多有多少顾客可以满意。
1≤n≤20,1≤m≤40,m表示小美能做菜的编号范围在[1,m]。
输入
3 4 1 2 2 3 3 4
输出
cc
dfs就是把所有情况都找一遍看看,对于每一个用户,我们都有选他不选的二值判断,这里还有加一个vis数组,来保证每种食材只能做一个菜。
1 a, b = [0]*25, [0]*25 2 vis = [0]*45 3 res, n, m = -1, 0, 0 4 5 def dfs(cur_user, cur_max): 6 if(cur_user== n): 7 global res 8 res = max(res, cur_max) 9 return 10 if(vis[a[cur_user]]==0 and vis[b[cur_user]]==0): 11 vis[a[cur_user]],vis[b[cur_user]] = 1, 1 12 dfs(cur_user+1, cur_max+1) 13 vis[a[cur_user]],vis[b[cur_user]] = 0, 0 14 dfs(cur_user+1, cur_max) 15 16 17 if __name__=="__main__": 18 n,m=map(int, input().split()) 19 for i in range(n): 20 a[i],b[i] = map(int, input().split()) 21 dfs(0,0) 22 print(res)
4、
小美在打音游,这个音游的玩法是这样的:
(1)共有n个房间,小美初始拥有一个指针,指在一号房间。
(2)游戏共持续m秒,每秒会有一个房间产生炸弹,小美的指针不能在这个房间中
(3)每秒结束的瞬间,小美可以使用一次魔法,把指针切换到另一个房间中,改过程会消耗一个能量
你的任务是计算小美无伤通过音游所需要消耗的最小能量。(保证第一秒的炸弹不发生在一号房间内)
n≤10,1≤m≤10000
输入
2 4 2 1 1 2
输出
2
输入
3 10 2 3 1 3 2 1 1 2 3 1
输出
3
dp[m][n] 第m秒,在第n个房间
room1 | room2 | |
1s | 0 | |
2s | 1 | |
3s | 1 | |
4s | 2 |
if __name__=="__main__": n, m = map(int, input().split()) INF = 10**8 dp = [[INF]*(n+2) for _ in range(m+2)] dp[1][1]=0 bomb = [0] tmp = list(map(int, input().split())) bomb.extend(tmp) for i in range(2, m+1): #从第2秒--m秒 for j in range(1, n+1): #从第1个房间到第n个房间 if(j == bomb[i]): continue for k in range(1, n+1): t = 0 if k==j else 1 dp[i][j] = min(dp[i][j], dp[i-1][k]+t) res = INF for i in range(1, n+1): res=min(res, dp[m][i]) print(res)
5、
现在给你一颗树,每个树上的节点会被直接涂成黑色1或者白色0。现在定义好节点:
(1)对于白色的节点:若改几点没有字节点,或者该节点子节点中至少有一个为黑色节点,则该节点是好节点
(2)对于黑色的节点:若该节点没有子节点,或者该节点的所有子节点均为白色,则该节点为好节点
你的任务是找出这颗树上黑色的好节点和白色的好节点各有几个。