4.10字节跳动后端笔试

4.10笔试第四题

凑成卡组的最少购买次数

from itertools import combinations

n = int(input())
prod = []
for _ in range(n):
    p = list(map(int,input().split()))
    prod += [p]
dp = [[float('Inf') for _ in range(2**10)] for _ in range(n+1)]
dp[0][0] = 0
for i in range(1,n+1):
    for j in range(2**10):
        dp[i][j] = min(dp[i][j],dp[i-1][j])
        k = []
        if j & 1 << prod[i-1][0] != 0:
            k += [prod[i-1][0]]
        if j & 1 << prod[i-1][1] != 0:
            k += [prod[i-1][1]]
        if j & 1 << prod[i-1][2] != 0:
            k += [prod[i-1][2]]
        k = list(set(k))
        if not k:
            continue
        for _ in k:
            dp[i][j] = min(dp[i][j],dp[i][j ^ 1 << _]+1)
        if len(k) >= 2:
            for comb in combinations(k,2):
                dp[i][j] = min(dp[i][j], dp[i][(j ^ 1 << comb[0]) ^ 1 << comb[1]]+ 1)
        if len(k) == 3:
            dp[i][j] = min(dp[i][j], dp[i][((j ^ 1 << k[0]) ^ 1 << k[1]) ^ 1 << k[2]]+ 1)

print(dp[-1][-1])






刷字节笔试3.27

第一题
给定长度为n的数组的元素只有0或1,问该数组的每个1之间是否至少有k个0?
def have_k_0(k,arr,n):
	n1 = sum(arr)

	if n1 > (n // (k+1) + 1):
		return False

	stack,flag = [],0
	for s in arr:
		if s == 0 and flag == 1:
			stack.append(s)
		elif s == 1 and flag == 1:
			flag == 1
			if len(stack) >= k:
				stack.clear()
			else:
				print('type II error')
				return False
		elif s == 1 and flag == 0:
			flag = 1
			
	return True

第二题
工作量为N,初始效率为1,效率每分钟加1,最大效率为M。最大效率可持续T分钟,之后会被强制休息10分钟,然后效率从1开始。允许主动休息5分钟,效率减半。问完成工作所需最少时间。
def MinTime(N,M,T):  m,total_time,max_t = 1,0,0  while N > 0:  if m < M:  N -= m  m += 1  total_time += 1  continue    if max_t <= T - 2:  N -= m  total_time += 1  max_t += 1  else:  if N - m <= 0:  N -= m  total_time += 1  else:  total_time += 5  m = m // 2  return total_time 

第三题
一根长度为x的魔法棒,选最长的偶数长度对半切割,从0秒到n秒,每秒切割一次,共n+1次。每根魔法棒每秒长度+1
def max_stick(x,n):  #cut longest even stick  def cut(odd_sticks,even_sticks,t):  if t % 2:  if odd_sticks: ##  stick = odd_sticks.pop()  else:  return odd_sticks,even_sticks  else:  if even_sticks:  stick = even_sticks.pop()  else:  return odd_sticks,even_sticks  new_stick = (stick + t)//2  if (new_stick - t) % 2:  odd_sticks += [new_stick - t] * 2  else:  even_sticks += [new_stick - t] * 2    return sorted(odd_sticks),sorted(even_sticks)  #separate even odd sticks  odd_sticks, even_sticks = [],[]  if x % 2:  odd_sticks += [x]  else:  even_sticks += [x]  #cut one each time, cut n+1 time  for t in range(n+1):  odd_sticks,even_sticks = cut(odd_sticks,even_sticks,t)  #empty list  if odd_sticks and even_sticks:  return max(odd_sticks[-1],even_sticks[-1]) + n  else:  return (odd_sticks[-1] or even_sticks[-1]) + n 
第四题
给定N个人,部分人可以互相通信,比如 a -> b, 那么b->a;也可以间接通信,比如a->b 且 b ->c,那么a ->c。
每次通信耗时1秒,问把一条信息传递给所有人,最少耗时多少秒?

while True:
    if True:
        N = int(input('>> 输入人数:'))
        dp = [[float('inf') for _ in range(N)] for _ in range(N)]
        for i in range(N):
            dp[i][i] = 0
            i_list = list(map(int,input('第'+str(i+1)+'个人的路径:').split()))
            for j in range(i_list[0]):
                dp[i][i_list[j+1]-1] = min(1,dp[i][i_list[j+1]-1])
                dp[i_list[j+1]-1][i] = dp[i][i_list[j+1]-1]
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j])

        paths = [max(start) for start in dp]
        print(min(paths))
    else:
        break


#字节跳动春招##春招##笔试题目##字节跳动#
全部评论
码一下
1 回复 分享
发布于 2022-04-09 15:43
字节笔试自测没有问题,后台测试用例一个都通不过😂 这好歹也要让我得几分吧
点赞 回复 分享
发布于 2022-04-10 12:16

相关推荐

10-10 12:03
门头沟学院 Java
Yoshikitties:哎麻了,和你差不多,甚至第二题只有0.9
投递携程等公司10个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 24 评论
分享
牛客网
牛客企业服务