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)對於黑色的節點:若該節點沒有子節點,或者該節點的所有子節點均為白色,則該節點為好節點

你的任務是找出這顆樹上黑色的好節點和白色的好節點各有幾個。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM