1. 程式人生 > >聰明木匠的切割問題

聰明木匠的切割問題

一位老木匠需要將一根長的木棒切成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);

}

}