华为机考 叠积木 python (以及处理输入)

发布于:2023-01-05 ⋅ 阅读:(709) ⋅ 点赞:(0)

较为拙劣的处理用例输入

由于本人算是半路出家,如果有更好的解决python的输入问题,还请不吝赐教

关于这个叠积木问题,我看到有这样的版本(转自添加链接描述
在这里插入图片描述输入的是包含长和宽的二维数组

还有这样的
在这里插入图片描述如果只是输入一项比较,未免也太简单了,和那个最长上升子序列问题很接近了

以第一个例子来说吧,需要比较长和宽
如果不考虑输入,算法是这样的

list1 = [[2,3],[6,3],[3,5],[5,4],[6,5]]
list2 = [[] for _ in range(len(list1))]
for i in range(len(list1)):
    list2[i].append(max(list1[i]))
    list2[i].append(min(list1[i]))
#上一个循环已经将长放在第一位,宽放在第二位了
#接下来根据第一位长的大小降序排列,在根据宽的大小降序排列
#该问题将变成类似最大递减子序列问题
list2 = sorted(list2,key=lambda x:(-x[0],-x[1]))
dp = [1]*(len(list2))  #左边没有比自己小的,则为1,仅一层
for i in range(1,len(list2)):
    for j in range(i):
        if list2[i][0] <= list2[j][0] and list2[i][1] <= list2[j][1] and dp[i] < dp[j] + 1:
            dp[i] = dp[j]+1       #dp[i]表示前i+1个积木最多可以叠多少层,如dp[2] = 2 ,表示前3个积木最多可以叠2层
print(dp)        
print(list2)
print(max(dp))     #即要求的解

这里关键的是排序,把长、宽顺序排完后(先长后宽),又变成类LIS问题了
如何传入测试用例,如

[[2,3],[6,3],[3,5],[5,4],[6,5]]

如果是核心代码模式的话,这个二维数组是不用你处理的,即把第一行去掉改改就好了
但很多机考要求是ACM模式,如何input()测试用例让我很是头疼,于是我选择了比较繁琐的方式

list1 = input()
list1 = list1.replace("[","")
list1 = list1.replace(']','')
list1 = list1.replace(',', ' ')
t = list(map(int,list1.split()))
print(list1)
print(t)

传入为字符串,再将二维数组里的元素转为整型(后续排序需要),不打乱持续(即长,宽,长,宽,长,宽…),print看一下转换后的结果
在这里插入图片描述再遍历t,将t中元素两项两项的存入新数组
创建二维数组temp

temp = [[] for _ in range((len(t)//2))]
count = 0
for i in range(0,len(t)-1,2):   #注意-1,只需要遍历到倒数第二项
    temp[count].append(t[i])
    temp[count].append(t[i+1])
    count += 1
print(temp)

输出为
在这里插入图片描述接下来就可以根据temp来进行求解了

list1 = input()
list1 = list1.replace("[","")
list1 = list1.replace(']','')
list1 = list1.replace(',', ' ')
t = list(map(int,list1.split()))
print(list1)
print(t)

temp = [[] for _ in range((len(t)//2))]
count = 0
for i in range(0,len(t)-1,2):
    temp[count].append(t[i])
    temp[count].append(t[i+1])
    count += 1
print(temp)

list2 = [[] for _ in range(len(temp))]
for i in range(len(temp)):
    list2[i].append(max(temp[i]))
    list2[i].append(min(temp[i]))
#上一个循环已经将长放在第一位,宽放在第二位了
#接下来根据第一位长的大小降序排列,在根据宽的大小降序排列
#该问题将变成类似最大递减子序列问题
list2 = sorted(list2,key=lambda x:(-x[0],-x[1]))
dp = [1]*(len(list2))  #左边没有比自己小的,则为1,仅一层
for i in range(1,len(list2)):
    for j in range(i):
        if list2[i][0] <= list2[j][0] and list2[i][1] <= list2[j][1] and dp[i] < dp[j] + 1:
            dp[i] = dp[j]+1       #dp[i]表示前i+1个积木最多可以叠多少层,如dp[2] = 2 ,表示前3个积木最多可以叠2层
print(dp)
print(list2)
print(max(dp))   #即所求解

将多余print()注释掉既可

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到