2011年8月9日 星期二

No Problem

內容 : 
最近程式競賽非常頻繁。儘管對參賽者來說這是好事,對出題者來說卻適得其反。目前出題者尚能維持一個題庫並說:「沒有問題!」但是如果繼續這樣下去不知道還能維持多久。
給你一年中每個月所出的題目數量及每個月所需要的題目數量。如果某個月需要 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. :(" (沒有題目)。
範例輸入 :
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
提示 :
雖然這個題目最好用「陣列」來解,但是不用陣列也可以解,只是程式碼會重覆且冗長。

5 則留言:

  1. 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

    回覆刪除
  2. 佑好,
    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.你也沒注意到當月出的題目,當月不能用,這個說明。

    回覆刪除
  3. 熊掌好,

    回覆消失了@@"~
    重寫了程式
    而題目說的考古題是我自己加的
    因為去年學長說這題義不清楚
    不過我懂了再寫一次
    沒有錯就是這樣



    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

    回覆刪除
  4. 佑好,
    程式正確。
    (因為旅行中無法上這個布落格,累積了有些多題,這幾天努力上網來改,還沒改完,熊掌加油。)
    (所以要你們用每天一題,慢慢就會累積功力的,加油。)

    回覆刪除
  5. 熊掌好,

    辛苦了,
    謝老師。

    現在沒有新題,
    要把錯的弄清楚:D

    回覆刪除