3歲的小明喜歡玩他的方塊積木,他總是把方塊疊在一起,型成高度不一的方塊堆。然後他說:這是一面牆。五歲的妹妹小每聽到了就跟小明說:真正的牆高度應該要一樣才行。小明聽了覺得有道理,於是決定要搬動一些方塊使所有方塊堆的高度一樣。如下圖。由於小明是個懶惰的小孩,他想要搬動最小數目的方塊,以達成這個目的,你能幫助他嗎? (輸入規範:每組資料有兩列 第一列有一個數字N,代表有幾堆方塊,第二列有n個數字,分別代表這N堆方塊的高度H。另1<=n<=50、1<=H<=100。方塊的總數一定可以整除堆數N,也就是說,一定可以使所有方塊同高度。)
▉
▉
▉ ▉▉
▉ ▉ ▉▉ →▉▉▉▉▉▉
▉ ▉ ▉▉ ▉▉▉▉▉▉
▉▉▉ ▉▉ ▉▉▉▉▉▉
▉▉▉▉▉▉ ▉▉▉▉▉▉
輸入範例:
6
5 2 4 1 7 5
輸出範例:
5
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就顯示請重新輸入這樣....@.@
高仔好,
回覆刪除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.題目中的兩個限制,第一是你的程式要能處理到這樣的範圍。第二也是可以像你說的將範圍外的輸入,顯示「輸入錯誤」。
倒不用像平常寫程式那樣再說個什麼"請重新輸入"之類的話。
範例有點看不懂@@
回覆刪除Y揚好,
回覆刪除如果配合圖的輸入,應該是:
6
7 2 4 1 5 5
抱歉 圖例沒用好
回覆刪除已經改正...ORZ
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?
不然答案可能會有小數點吧= =?
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
假如向老師說的有輸入錯誤
這樣子寫可以吧@@
※方塊的總數一定可以整除堆數N,也就是說,一定可以使所有方塊同高度※
回覆刪除沒注意到齁 要小心唷 XD
阿瑋好,
回覆刪除你的程式是對的,計算更簡化了。
也就是說,原來的高仔的程式還有地方可以改,我原先沒看出來。
因為高仔的程式,會把需要搬的數目多算一次,於是最後寫入的地方,才再多一次計算。(ans/2)
整除的問題,原先題目就先說好了。
用 大於 平均值 和 小於 平均值 來 比 應該可以吧@@
回覆刪除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
Y揚好,
回覆刪除你的程式ok,而且你還用了一個方式去增加檢查有沒有"錯誤"輸入,很好。
這個部分,你(們)先如此做著,至於該如何輸出,因為題目中並沒有說明,暫時先「隨意」處理。(等我再問問前個指導老師,或是,再去找找前幾屆的前幾名的程式,都是如何處理錯誤輸入的狀況,再來統一規定吧。)
大家好,
回覆刪除原來,「錯誤的輸入,全部不處理,因為時間有限」。
哦,還有,只看結果,不看程式比分數,結果對,該題滿分,結果有一個不對,該題0分。
所以,再說一次,那些錯的,不理它。像Y揚的那一題,直接
print #2,q
就好了,不用管q=w,反正那些不理。
所以,那麼,確定是用vb6,所以,前面的題目解題中,有同學用字串解數字的,有用字串函數結果,當成變數的,都可以。
不過,在有機會批改各位的程式的時候,我還是會指出,那些是「正統」的方式,那些是「捷徑」,同學們心裡分的清楚,在解題時,「黑貓白貓,能捉老鼠的,就是好貓」。
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
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