聰明木匠的切割問題
阿新 • • 發佈:2018-12-09
一位老木匠需要將一根長的木棒切成N段。每段的長度分別為L1,L2,……,LN(1 <= L1,L2,…,LN <= 1000,且均為整數)個長度單位。我們認為切割時僅在整數點處切且沒有木材損失。
木匠發現,每一次切割花費的體力與該木棒的長度成正比,不妨設切割長度為1的木棒花費1單位體力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,則木棒原長為12,木匠可以有多種切法,如:先將12切成3+9.,花費12體力,再將9切成4+5,花費9體力,一共花費21體力;還可以先將12切成4+8,花費12體力,再將8切成3+5,花費8體力,一共花費20體力。顯然,後者比前者更省體力。 那麼,木匠至少要花費多少體力才能完成切割任務呢?
Input
第1行:1個整數N(2 <= N <= 50000)
第2 - N + 1行:每行1個整數Li(1 <= Li <= 1000)。
Output示例
19
//程式碼塊
package Eleve;
import java.util.Scanner;
public class the_Old_Carpenter {
public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int sum = 0; //定義一個數組來存放所切的段數 int[] array = new int[a]; //將所要切得每一段的具體長度輸入,組成一個數組 for(int i=0;i<array.length;i++){ array[i] = sc.nextInt(); } //對所輸入的數字進行排序 for(int i= 0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ int m=0; m = array[j]; array[j] = array[j+1]; array[j+1] = m; } } } //切割的時候應該是先從最大的開始切 for(int i = array.length-2;i>=0;i--){ int sum1 = 0; for(int j = i;j>=0;j--){ sum1+=array[j]; } sum = sum+array[i+1]+sum1; } System.out.print("最短時間為:"+sum); }
}