2011年8月8日 星期一

數字合併

黑板上有n個數字寫成一排,現在每次選擇兩個相鄰的數字,把比較小的那個 數字擦掉(如果兩個數字一樣大,那麼擦掉任何一個都可以。)然而,這些步驟需要花費,這個花費恰好等於留下來的那個數字(比較大的那個)。

請問經過n-1次操作,黑板上會剩下的那個數字是多少?

你以為問題這麼簡單嗎?錯!

真正的問題是:

請問經過n-1次操作,黑板上會剩下最大的那個數字,所有操作方法中,最小總花費是多少?
輸入說明 :
輸入檔只包含一筆測試資料。
第一列有一個正整數n(1<=n<=1,000,000)代表黑板上數字的個數。
接下來有n列,每列有一個正整數(1<=數字<=109)依序代表黑板上的每個數字。
輸出說明 :
請輸出經過n-1次操作之後,所需的最小總花費。
範例輸入 :
5
7
4
5
2
5
範例輸出 :
22

提示 :
消掉4、花費5;
消掉2、花費5;
消掉5、花費5;
消掉5、花費7;
總花費是5+5+5+7=22。

6 則留言:

  1. 先紙上談兵似乎很有用:)

    Private Sub Form_Load()
    Dim ans As Integer
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    List1.AddItem "佔"
    Do While Not EOF(1)
    Input #1, X
    List1.AddItem X
    Loop

    Do
    j = (List1.ListCount - 2)

    List2.AddItem 0
    For i = 1 To j

    If Val(List1.List(i)) > Val(List1.List(i + 1)) Then
    Call ABC(Val(List1.List(i)), i + 1)
    Else
    Call ABC(Val(List1.List(i + 1)), i)
    End If

    If i = j Then ans = ans + Val(List2.List(0)): List2.List(0) = 0: List1.RemoveItem (Val(List3.List(0)))
    Next i
    Loop Until List1.ListCount = 3

    Print #2, ans

    Close #2
    Close #1
    End
    End Sub

    Sub ABC(A, B)
    C = Val(List2.List(0))
    If A <= C Or C = 0 Then
    List2.Clear: List3.Clear
    List2.AddItem A
    List3.AddItem B
    End If
    End Sub

    回覆刪除
  2. 佑好,
    1,
    這題你的解題演算法,有些怪怪的,倒底你消掉的順序是什麼?
    比如下列的輸入:(以空格代替換行)
    10 30 28 20 26 10 4 40 48 60 70

    2.你在for i = 1 to j的迴圈中,放進的第2個if,是多餘的,每次都會浪費1次時間去看看迴圈結束了沒,你問 if i = j then,不就是迴圈結束嗎?
    那麼,你就在迴圈外去做就對了,只要一次,不用再判斷了。

    回覆刪除
  3. list3是存取 接著消掉的位子
    list2是存取 花費數

    加個
    Print #2, "消掉" & List1.List(Val(List3.List(0))) & "、花費" & List2.List(0)

    消掉2、花費5
    消掉5、花費5
    消掉4、花費5
    消掉5、花費7
    22

    回覆刪除
  4. 熊掌好,

    第二點我會特別注意到的

    回覆刪除
  5. 佑好,
    題目中「所需的最小總花費」你是如何達成的呢?
    我另外舉的例子,你的執行結果呢?

    回覆刪除
  6. 消掉4、花費10
    消掉10、花費26
    消掉20、花費26
    消掉26、花費28
    消掉28、花費30
    消掉10、花費30
    消掉30、花費40
    消掉40、花費48
    消掉48、花費60
    298

    回覆刪除