我有一张木板,并在木板上给出了N个标记。现在我必须切割木板上的所有标记,以便将所有标记切割成最小值。现在假设我先切割了i那么成本通过使用两个作为输入的乘数a和b给出,并且成本是a *(左)+ b *(右),其中左和右是切割后木材的剩余部分的尺寸。例如如果我有一个长度为10,a = 3和b = 4的木头,并且如果我有前面的标记列表:[1,3,5,7,10],所以我不能砍掉第一个和最后一个标记,因为它们是开始和所以假设如果我先从7开始,那么切割的成本将是3 *(7-1)+ 4 *(10-7)= 18 + 12 = 30,现在我所拥有的木材是一个以标记1开始标记7,另一个开始标记7以结束木头广告我会重复这个过程,直到所有的标记都被切掉。削减成本算法优化
现在读到这个问题后,我立即想到,为了以最低成本砍伐木材,我首先需要找到中点(切割点的中位数),在那里我应该砍木头并重复这个过程一次又一次,直到木材没有剩余的切割点,但我在解决切割后获得的合适木材时遇到问题
样品输入:切割有[1,3,5,9,16,22]的木材会有最低成本= 163当我们第一次以中位数9开始时,我们现在会先用木头[1,3,5,9]和[9,16,22]来解决我们将要得到的左木[1,3,5 ] [5,9],现在再次切割我们有[1,3] [3,5] [5,9]和现在剩下的[9,16,22]现在操作这种木材,我们已经切割了所有商标和名单将是[1,3] [3,5] [5,9] [9,16] [16,22]并在此操作的成本将是最低
这里是我的代码:
for _ in range(int(input())): #no of test cases
a,b=map(int,input().split()) #multiplier element of cost ex: 3,4
n=int(input()) #total number of cuts ex: 6
x=list(map(int,input().split())) #where the cuts are the wood ex:
#[1,3,5,9,16,22]
lis=[]
cost=0
average=sum(x)/len(x)
median=min(x,key=lambda X:abs(X-average)) #calculated the median
cost+=a*(median-x[0])+b*(x[-1]-median) #calculated the cost of cutting
print(cost)
var=x.index(median) #found the index of median
x_left=x[:var+1] #split the wood in left and right
x_right=x[var:]
lis.append(x_right)
while(len(x_left)>2): #done the same process going first on left wood
average=sum(x_left)/len(x_left)
median=min(x_left,key=lambda X:abs(X-average))
cost+=a*(median-x_left[0])+b*(x_left[-1]-median)
var=x.index(median)
x_left=x_left[:var+1]
x_right=x_left[var:] #this wood would again have right component so
#stored that right side in list named lis
lis.append(x_right)
print(cost) #fully solved by moving leftwards
print(lis)
tt=len(lis)
for i in lis: #but the problem start here i have all the right
#pieces of wood that i had stored in lis but now i
#can't evaluate them
if(len(i)<3):
lis.pop(lis.index(i))
else:
continue
print(lis)
while(tt!=0):
xx=lis.pop(0)
ttt=len(xx)
if(ttt>2):
average=sum(xx)/ttt
median=min(xx,key=lambda X:abs(X-average))
cost+=a*(median-xx[0])+b*(xx[-1]-median)
var=x.index(median)
x_left=xx[:var+1]
x_right=xx[var:]
if(len(x_left)>2):
lis.append(x_left)
if(len(x_right)>2):
lis.append(x_right)
print(cost)
这是编码竞赛的问题吗?你能否提供一个原始问题的链接? –
您的代码相当混乱,并且在开始时它没有正确缩进。但是,将硬编码数据替换为从'输入'读取数据的起始部分会更好,当您尝试开发代码时,在输入提示处输入数据会很烦人。你可以减少你的代码的混乱,并通过使用函数减少重复。你为什么认为中位数的减少会起作用?它可能在某些情况下,但一般情况下不会。切入点计算_需要考虑'a'和'b'。 –
@ PM2Ring,因为如果木头沿着一端被切割,其余的将会有较大的尺寸并且成本会更大。假设我有长度为20的木材并且在其上标记[1,3,5,7,10 ,15,17,20]现在假设我有同样的a和b,那么我可以降低成本的最佳方式是选择10,因为左端和右端的差异将是相同的,如果我将减少15分首先削减的成本将是相同的,其余的成本将会更高。 – Demonking28