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)對於黑色的節點:若該節點沒有子節點,或者該節點的所有子節點均為白色,則該節點為好節點
你的任務是找出這顆樹上黑色的好節點和白色的好節點各有幾個。