Ich habe ein Blatt Holz und haben N Markierung auf Holz gegeben sheet.Now ich alle Markierungen auf Holzplatte geschnitten haben, so dass Kosten alle Markierungen in minimum.Now des Schneidens nehme ich immer zuerst auf der i th Markierung dann werden die Kosten durch Verwendung von zwei Multiplizierern a und b gegeben, die Eingänge sind und die Kosten sind a * (l) + b * (rechts), in dem nach links und rechts sind die Größe des verbleibenden Teils des Holzes nach .für Beispiel Schneiden wenn ich ein holz der länge 10 und a = 3 und b = 4 habe und wenn ich eine markliste für ex habe: [1,3,5,7,10] so kann ich die erste und letzte markierung nicht schneiden, weil sie die anfangs- und die letzte sind Endpunkt des Holzes also angenommen, wenn ich mit Markierung 7 zuerst beginne, dann werden die Kosten des Schneidens 3 * (7-1) + 4 * (10-7) = 18 + 12 = 30 sein und jetzt ist das Holz, das ich haben würde eine, die mit Markierung 1 beginnt, um 7 zu markieren, und andere würde eins mit Markierung 7 bis zum Ende der Holzanzeige sein und ich würde den Prozess wiederholen, bis alle Markierungen geschnitten worden sind.Schneid Kosten Algorithmus Optimierung
Jetzt nach dem Lesen der Frage kam mir sofort in den Sinn, dass, um das Holz in minimalen Kosten zu schneiden ich zuerst den Mittelpunkt finden muss (Median der Schnittpunkte) und dort sollte ich das Holz schneiden und diesen Prozess wiederholen immer wieder, bis das Holz keine Schnittpunkte mehr hat, aber ich habe Probleme mit dem Lösen des richtigen Holzes nach dem Schneiden
Beispiel Eingabe: Holz mit [1,3,5,9,16,22] würde geschnitten haben Mindestkosten = 163, wenn wir zuerst mit Median 9 anfangen, dann würden wir Holz der Marke [1,3,5,9] und [9,16,22] haben, das zuerst das linke Holz löst, das wir haben würden [1,3,5 ] [5,9], nun wieder schneidend, haben wir [1,3] [3,5] [5,9] und dasjenige, das übriggeblieben war [9,16,22], jetzt, wo wir dieses Holz bearbeitet haben, haben wir alle geschnitten Noten und die Liste wäre [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)
Ist diese Frage von einem Codierungswettbewerb? Können Sie bitte einen Link zu der ursprünglichen Frage angeben? –
Ihr Code ist ziemlich unordentlich und am Anfang nicht richtig eingerückt. Es wäre jedoch besser, den Startabschnitt zu ersetzen, der die Daten von "Eingabe" mit hartcodierten Daten liest, es ist ärgerlich, Daten an der Eingabeaufforderung "Eingabe" einzugeben, wenn Sie versuchen, Code zu entwickeln. Sie könnten Ihren Code weniger unordentlich machen und die Wiederholung reduzieren, indem Sie Funktionen verwenden. Warum glauben Sie, dass das Schneiden auf dem Median funktioniert? Es könnte in einigen Fällen, aber nicht im Allgemeinen. Die Schnittpunktberechnung _needs_ muss "a" und "b" berücksichtigen. –
@ PM2Ring weil, wenn ein Holz entlang einer Seite des Endes geschnitten wird, würde der Rest groß sein und die Kosten wären mehr, wenn ich ein Holz der Länge 20 und Markierungen darauf hätte [1,3,5,7,10 , 15,17,20] Nun nehme ich an, ich habe das gleiche a und b, dann ist der beste Weg, die Kosten zu reduzieren, 10 zu wählen, weil die Differenz vom linken Ende und vom rechten Ende gleich wäre, wenn ich die 15 Marke abgeschnitten hätte die Kosten für das Schneiden wären zunächst gleich, dann wären die verbleibenden Kosten höher gewesen. – Demonking28