內容 :
最近程式競賽非常頻繁。儘管對參賽者來說這是好事,對出題者來說卻適得其反。目前出題者尚能維持一個題庫並說:「沒有問題!」但是如果繼續這樣下去不知道還能維持多久。
給你一年中每個月所出的題目數量及每個月所需要的題目數量。如果某個月需要 N 個題目,而當時的題庫數量不足,那麼該月的所有比賽均取消。請寫個程式來判斷是否有足夠的題目來辦比賽。記住,如果某個題目是在 X 月出的,該題目必須在 X+1 月或其後的月份才能使用。
給你一年中每個月所出的題目數量及每個月所需要的題目數量。如果某個月需要 N 個題目,而當時的題庫數量不足,那麼該月的所有比賽均取消。請寫個程式來判斷是否有足夠的題目來辦比賽。記住,如果某個題目是在 X 月出的,該題目必須在 X+1 月或其後的月份才能使用。
輸入說明 :
每筆測資的第一行有一個整數 S (0≤S≤100),表示年初已有的庫存題目數量。第二行有 12 個以空白隔開的整數,依序表示一到十二月每個月所出的題目數量。第三行也有 12 個以空白隔開的整數,依序表示每個月比賽所需要的題目數量。這些整數會介於 0 到 20 之間 (含)。負數代表輸入的結束。
輸出說明 :
對於每筆測資,印出一行 "Case X:",X 代表測資編號。然後印出 12 行,如果 i 月 (1≤i≤12) 有足夠的題目,則在第 i 行印出"No problem! :D" (沒有問題),否則印出 "No problem. :(" (沒有題目)。
範例輸入 :
5
3 0 3 5 8 2 1 0 3 5 6 9
0 0 10 2 6 4 1 0 1 1 2 2
-1
範例輸出 :
Case 1:
No problem! :D
No problem! :D
No problem. :(
No problem! :D
No problem! :D
No problem! :D
No problem! :D
No problem! :D
No problem! :D
No problem! :D
No problem! :D
No problem! :D
提示 :雖然這個題目最好用「陣列」來解,但是不用陣列也可以解,只是程式碼會重覆且冗長。
Dim N As Integer
回覆刪除Private 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, N
List1.AddItem N
Print #2, "Case 1:"
For i = 1 To 2
For j = 1 To 12
If i = 1 Then Input #1, X: N = N + X: List1.AddItem N
If i = 2 Then Input #1, Y: List2.AddItem Y
Next j
Next i
For i = 0 To 11
A = Val(List1.List(i))
B = Val(List2.List(i))
If A >= B Then Print #2, "No problem!: D" Else Print #2, "No problem.:("
Next i
Close #2
Close #1
End
End Sub
佑好,
回覆刪除1.程式錯誤。
這題是標準的囉嗦題目型。
題目中說「每筆測資的第一行」,所以可能有很多筆資料,但是你只處理成一筆,所以是錯的。
2.
For i = 1 To 2
For j = 1 To 12
If i = 1 Then Input #1, X: N = N + X: List1.AddItem N
If i = 2 Then Input #1, Y: List2.AddItem Y
Next j
Next i
這個雙迴圈,沒必要,浪費執行其中的if,等於多執行48個if判斷。
就分成2個單迴圈吧。
3.程式還有一個更大的可能的錯誤,出過的題目,沒有減掉嗎?
可是你找到的題目的最後有說,可以有考古題,這句話怪怪的,似乎是你當成出過的題目,一直可以累加著用,那麼只要題庫超過20題,萬年沒問題?
4.你也沒注意到當月出的題目,當月不能用,這個說明。
熊掌好,
回覆刪除回覆消失了@@"~
重寫了程式
而題目說的考古題是我自己加的
因為去年學長說這題義不清楚
不過我懂了再寫一次
沒有錯就是這樣
Private Sub Form_Load()
Dim Can_Be
Dim Year
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Year = 0
Do While Not EOF(1)
Input #1, N
If N < 0 Then Exit Do Else Can_Be = N
Year = Year + 1
List1.Clear: List2.Clear
For i = 1 To 12
Input #1, X
List1.AddItem X
Next i
For i = 1 To 12
Input #1, Y
List2.AddItem Y
Next i
Print #2, "Case " & Year & ": "
For i = 0 To 11
If Val(List2.List(i)) <= Can_Be Then
Print #2, "No; problem!: D"
Can_Be = Can_Be - Val(List2.List(i))
Else
Print #2, "No problem. :("
End If
Can_Be = Can_Be + Val(List1.List(i))
Next i
Loop
Close #2
Close #1
End
End Sub
-------in------
5
3 0 3 5 8 2 1 0 3 5 6 9
0 0 10 2 6 4 1 0 1 1 2 2
0
1 2 3 4 1 2 3 4 5 1 2 3
0 3 3 1 2 3 4 5 6 0 0 1
-1
--------out-------
Case 1:
No; problem!: D
No; problem!: D
No problem. :(
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
Case 2:
No; problem!: D
No problem. :(
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
No problem. :(
No; problem!: D
No; problem!: D
No; problem!: D
No; problem!: D
佑好,
回覆刪除程式正確。
(因為旅行中無法上這個布落格,累積了有些多題,這幾天努力上網來改,還沒改完,熊掌加油。)
(所以要你們用每天一題,慢慢就會累積功力的,加油。)
熊掌好,
回覆刪除辛苦了,
謝老師。
現在沒有新題,
要把錯的弄清楚:D