2010年2月4日 星期四

2010/02/04 方塊積木

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

輸入範例:

5 2 4 1 7 5
輸出範例:

14 則留言:

  1. Dim H(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "/in.txt" For Input As #1
    Input #1, N
    For i = 1 To N
    Input #1, H(i - 1)
    Sum = Sum + H(i - 1)
    Next i
    ave = Sum / N
    Close #1
    For i = 1 To N
    If (H(i - 1) - ave) < 0 Then
    a = -(H(i - 1) - ave)
    Else
    a = (H(i - 1) - ave)
    End If
    ans = ans + a
    Next i
    Open App.Path & "/out.txt" For Output As #2
    Print #2, ans / 2
    Close #2
    End Sub

    上面那個積木有點誤差 不過應該還是看的懂吧~
    題目中有提到1<=n<=50、1<=H<=100
    不知是否應該要在程式中設限呢?
    像是超過1<=n<=50、1<=H<=100就顯示請重新輸入這樣....@.@

    回覆刪除
  2. 高仔好,
    1.
    If (H(i - 1) - ave) < 0 Then
    a = -(H(i - 1) - ave)
    Else
    a = (H(i - 1) - ave)
    End If
    ->
    a=h(i-1)-ave
    if a <0 then a = -a
    這樣的話,計算少些,也清楚些。而且一樣可以減少使用abs(x)這個函數。
    2.題目中的兩個限制,第一是你的程式要能處理到這樣的範圍。第二也是可以像你說的將範圍外的輸入,顯示「輸入錯誤」。
    倒不用像平常寫程式那樣再說個什麼"請重新輸入"之類的話。

    回覆刪除
  3. 範例有點看不懂@@

    回覆刪除
  4. Y揚好,
    如果配合圖的輸入,應該是:
    6
    7 2 4 1 5 5

    回覆刪除
  5. 抱歉 圖例沒用好
    已經改正...ORZ

    回覆刪除
  6. Dim sum, ans, h(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Input #1, n

    i = 1

    Do While Not EOF(1)
    Input #1, h(i)
    sum = sum + h(i)
    i = i + 1
    Loop

    Avg = sum / n

    For i = 1 To n
    x = h(i) - Avg
    If x > 0 Then ans = ans + x
    Next i

    Print #2, ans

    Close #1
    Close #2
    End Sub

    這題輸入資料總合勢必要可以整除N?
    不然答案可能會有小數點吧= =?

    回覆刪除
  7. Dim sum, ans, h(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    i = 1
    Do While Not EOF(1)
    Input #1, h(i)
    sum = sum + h(i)
    i = i + 1
    Loop
    Avg = sum / n
    k = Int(Avg)
    If Avg = k Then
    For i = 1 To n
    x = h(i) - Avg
    If x > 0 Then ans = ans + x
    Next i
    Print #2, ans
    Else
    Print #2, "輸入錯誤"
    End If
    Close #1
    Close #2
    End Sub
    假如向老師說的有輸入錯誤
    這樣子寫可以吧@@

    回覆刪除
  8. ※方塊的總數一定可以整除堆數N,也就是說,一定可以使所有方塊同高度※
    沒注意到齁 要小心唷 XD

    回覆刪除
  9. 阿瑋好,
    你的程式是對的,計算更簡化了。
    也就是說,原來的高仔的程式還有地方可以改,我原先沒看出來。
    因為高仔的程式,會把需要搬的數目多算一次,於是最後寫入的地方,才再多一次計算。(ans/2)
    整除的問題,原先題目就先說好了。

    回覆刪除
  10. 用 大於 平均值 和 小於 平均值 來 比 應該可以吧@@
    Private Sub Form_Load()
    Dim a(50) As Integer
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, x
    For i = 1 To x
    Input #1, a(i)
    y = y + a(i)
    Next i
    Close #1
    s = y / x
    For i = 1 To x
    If a(i) > s Then
    q = q + (a(i) - s)
    Else
    w = w + (s - a(i))
    End If
    Next i
    If q = w Then
    Print #2, q
    Else
    Print #2, "錯誤"
    End If
    Close #2
    End Sub

    回覆刪除
  11. Y揚好,
    你的程式ok,而且你還用了一個方式去增加檢查有沒有"錯誤"輸入,很好。
    這個部分,你(們)先如此做著,至於該如何輸出,因為題目中並沒有說明,暫時先「隨意」處理。(等我再問問前個指導老師,或是,再去找找前幾屆的前幾名的程式,都是如何處理錯誤輸入的狀況,再來統一規定吧。)

    回覆刪除
  12. 大家好,
    原來,「錯誤的輸入,全部不處理,因為時間有限」。
    哦,還有,只看結果,不看程式比分數,結果對,該題滿分,結果有一個不對,該題0分。
    所以,再說一次,那些錯的,不理它。像Y揚的那一題,直接
    print #2,q
    就好了,不用管q=w,反正那些不理。
    所以,那麼,確定是用vb6,所以,前面的題目解題中,有同學用字串解數字的,有用字串函數結果,當成變數的,都可以。
    不過,在有機會批改各位的程式的時候,我還是會指出,那些是「正統」的方式,那些是「捷徑」,同學們心裡分的清楚,在解題時,「黑貓白貓,能捉老鼠的,就是好貓」。

    回覆刪除
  13. Dim sum As Integer, ans As Integer, a(50) As Integer
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, qq
    For i = 1 To qq
    Input #1, a(i)
    sum = sum + a(i)
    Next i
    Avg = sum / qq
    p = Int(Avg)
    If Avg = p Then
    For i = 1 To qq
    x = a(i) - Avg
    If x > 0 Then ans = ans + x
    Next i
    Print ans
    Else
    Print #2, "輸入錯誤"
    End If
    Close #1
    Close #2
    End Sub

    回覆刪除
  14. Dim a(100) As Integer
    Public Sub Form_Load()
    Me.Hide
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    Input #1, xx
    ans = 0
    i = 1
    Do Until EOF(1)
    Input #1, x
    a(i) = x
    ans = ans + x
    i = i + 1
    Loop
    ans = ans \ xx
    M = 0
    For j = 1 To i - 1
    If a(j) > ans Then M = M + (a(j) - ans)
    Next j
    Print #2, M
    Close #2
    Close #1
    End
    End Sub

    4分29

    回覆刪除