美团春招笔试总结

涉及到子序列的基本都要考虑前缀和
n=int(input()) l=list(map(int,input().split())) sum=[0]*(n+1) #在0号位预留个0 res=0 for i in range(1,n+1): sum[i]=sum[i-1]+(l[i-1]==-1) #记录该元素(包括)前共有几个-1 for i in range(1,n+1): for j in range(i,n+1): if (sum[j]-sum[i-1])%2==0: #计算区间内-1的个数 res+=1 print(res)

需要一个状态列表,记录每个菜是否可提供;当过程中有不同种选择时,考虑深度优先遍历
n,m=map(int,input().split()) a=[0]*n b=[0]*n for i in range(n): a[i],b[i]=map(int,input().split()) #记录每位用户点菜情况 res=0 flag=[1]*(m+1) #状态列表 def dfs(i,cur): if i==n: global res res=max(res,cur) return if flag[a[i]] and flag[b[i]]: #每个人的两道菜同时满足 flag[a[i]]=0 flag[b[i]]=0 dfs(i+1,cur+1) flag[a[i]]=1 flag[b[i]]=1 dfs(i+1,cur) dfs(0,0) print(res)

看到第一秒是给定的初始状态,每一秒的结果都在上一秒的基础上操作,考虑dp
n,m=map(int,input().split()) tmp=list(map(int,input().split())) bomb=[0] bomb.extend(tmp) INF=10**8 dp=[[INF]*(n+2) for _ in range(m+2)] dp[1][1]=0 for i in range(2,m+1): for j in range(1,n+1): 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)

浙公网安备 33010602011771号