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)对于黑色的节点:若该节点没有子节点,或者该节点的所有子节点均为白色,则该节点为好节点

你的任务是找出这颗树上黑色的好节点和白色的好节点各有几个。

 

posted @ 2022-03-13 20:12  浅忆~  阅读(975)  评论(0编辑  收藏  举报