2012年1月20日 星期五

方塊積木

13歲的小明喜歡玩他的方塊積木,他總是把方塊疊在一起,型成高度不一的方塊堆。然後他說:這是一面牆。五歲的妹妹小每聽到了就跟小明說:真正的牆高度應該要一樣才行。小明聽了覺得有道理,於是決定要搬動一些方塊使所有方塊堆的高度一樣。如下圖。由於小明是個懶惰的小孩,他想要搬動最小數目的方塊,以達成這個目的,你能幫助他嗎? (輸入規範:每組資料有兩列 第一列有一個數字N,代表有幾堆方塊,第二列有n個數字,分別代表這N堆方塊的高度H。另1<=n<=50、1<=H<=100。方塊的總數一定可以整除堆數N,也就是說,一定可以使所有方塊同高度。)
     ▉
     ▉
▉   ▉▉ →
▉ ▉ ▉▉   ▉▉▉▉▉▉
▉ ▉ ▉▉   ▉▉▉▉▉▉
▉▉▉ ▉▉   ▉▉▉▉▉▉
▉▉▉▉▉▉   ▉▉▉▉▉▉

輸入範例:
6
5 2 4 1 7 5
輸出範例:
5

5 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Dim y(50) As Integer
    Input #1, x
    For i = 1 To x
    Input #1, y(i)
    z = z + y(i)
    Next
    b = z / x
    For i = 1 To x
    If y(i) > b Then
    c = y(i) - b
    ans = ans + c
    End If
    Next
    Print #2, ans
    Close
    Close
    End
    End Sub

    回覆刪除
  2. 小冰好,
    這題正確。
    比賽的題目中,沒有說需要做錯誤處理的,就不用做錯誤處理。
    (平常自己在寫非比賽的程式時,要特別注意錯誤的處理哦,但是,訓練比賽的,就不用了。)

    回覆刪除
  3. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Dim x(50) As Integer
    Input #1, n
    For i = 1 To n
    Input #1, x(i)
    y = y + x(i)
    Next i
    c = y / n
    ans = 0

    For i = 1 To n
    If x(i) > c Then
    a = x(i) - c
    ans = ans + a
    End If
    Next i
    Print #2, ans
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  4. 晟晟好,
    程式正確。

    a=x(i)-c
    ans = ans+a

    這樣的兩行,也可以習慣成一行。
    ans = ans + (x(i) -c)

    加上括弧,是讓自己除錯時,容易看懂自己的程式寫法。

    另外,多思考一個,
    這麼簡單的一題,可以用一個for迴圈就好了嗎?

    回覆刪除
  5. Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Dim y(50) As Integer
    Input #1, x
    For i = 1 To x
    Input #1, y(i)
    a = a + y(i)
    Next
    b = a / x
    For i = 1 To x
    If y(i) > b Then
    c = y(i) - b
    ans = ans + c
    End If
    Next
    Print #2, ans
    Close
    Close
    End

    回覆刪除