2011年5月2日 星期一

海星

  每個人都有自己的喜歡的東西,而Fuko最喜歡的就是海星了。你沒看錯,請不要對別人的興趣不以為然。


而且善良純真的Fuko秉持著與民同樂的想法,想把快樂散佈到這個世界上,她認為只要讓每個人都有海星,這個世界就可以變得和諧愉快。


所以她利用閒暇時間雕刻木製海星,然後一遇到自己的朋友就把海星硬塞到對方手中。


因為這個木製海星是手工製的,所以每一個海星都不會相同,而Fuko會在送出每個海星前在上面標明自己對於這個海星的滿意度x,x越大代表她對這顆海星越滿意。


為了讓自己的雕刻海星更臻於完美,她會不時的回想起她送出的海星中第k好的滿意度,然後利用自己對於海星的驚人記憶力想起那個海星的優缺點進而改進技術。


只可惜人並不是完美的,雖然Fuko對海星有強大的記憶力,可是看到亂七八糟的數字就舉手投降了,這讓她造成了非常大的困擾,沒有辦法想起滿意度就沒有辦法雕刻出更好的海星,當然也就不能讓這個世界更加和平了!


Fuko的姐姐Kouko知道了Fuko的煩惱,所以特地請你來幫她寫一個程式,可以記錄她送出的海星滿意度,並在適當的時候提醒她目前送出的第k好的海星是哪一個。




輸入說明 :


每行有一條指令依序執行,分別為


GIVE X:代表送出一個滿意度為X的海星             ( 0 < X <= 100000000 )
FIND K:代表回想送出的海星中第K好的滿意度   
END:Fuko累了要去睡覺囉!



輸出說明 :


對於下列三種指令


GIVE X:不輸出
FIND K:輸出Fuko送出的海星中第K好的滿意度
END:不輸出並結束程式






範例輸入 :


GIVE 1
GIVE 3
GIVE 5
FIND 1
FIND 2
FIND 3
GIVE 2
GIVE 4
FIND 1
FIND 2
FIND 3
FIND 4
FIND 5
END 


範例輸出 :


5
3





1




轉自:http://cat.nknush.kh.edu.tw/ShowProblem?problemid=d314

9 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Dim s
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Do While Not EOF(1)

    Line Input #1, N
    s = Split(N)
    Select Case s(0)
    Case "GIVE": List1.AddItem s(1)
    Case "FIND": Print #2, MyFind(s(1))
    Case "END":
    End Select

    Loop
    Close
    Close
    End
    End Sub


    '////////////////////////////////////////////////////////////////////


    Function MyFind(a)

    Dim sort As Integer, max As Integer, max2 As Integer

    List2.Clear
    For i = 0 To List1.ListCount - 1
    List2.AddItem List1.List(i)
    Next



    Do

    For i = 0 To List2.ListCount - 1
    If Val(List2.List(i)) > max Then max = Val(List2.List(i)): max2 = Val(List2.List(i))
    Next

    List3.Clear
    sort = sort + 1

    For i = 0 To List2.ListCount - 1
    If Val(List2.List(i)) <> max Then List3.AddItem List1.List(i) Else max = -1
    Next

    List2.Clear

    For i = 0 To List3.ListCount - 1
    List2.AddItem List3.List(i)
    Next

    Loop Until sort = a

    MyFind = max2
    End Function


    ----

    這題我用了3個 List來做
    第一個是原始輸入
    第二個跟第三個做互換用

    回覆刪除
  2. 忘了在 Case "END": 後面補 END 了

    回覆刪除
  3. arro好,
    程式雖然應該是正確,但是,你會不會用得太辛苦了些啊。
    不就是個排序與找尋嗎?
    你可以在每次要找第幾大的時候,去排序。
    你也可以在加入的listbox中,選用「字串式的數字排序法」,讓listbox自己排序好,你只要輸出第幾項就好了。
    ***
    所以,其實還是寫的程式不夠多,廣度還有加寬的需要哦。

    回覆刪除
  4. 幸好數字還算不大,
    用list數字排序法只能排第一個數@@"
    會變成

    3
    2
    10000


    Dim X(100000000) As Long
    Dim N As Long
    Private Sub Form_Load()
    Me.Hide
    Dim A As String
    Dim B As Long

    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    N = 0
    Do

    Input #1, INP
    AB = Split(INP)
    A = AB(0)
    If A <> "END" Then B = AB(1) Else


    Select Case A
    Case "GIVE": X(N) = B: N = N + 1
    Case "FIND": Call F: ans = Val(List1.List(B - 1)): Print #2, ans
    End Select

    Loop Until A = "END"
    End
    End Sub

    Sub F()
    List1.Clear

    For i = 0 To N - 2
    For j = i + 1 To N - 1
    If X(i) < X(j) Then
    CH = X(j)
    X(j) = X(i)
    X(i) = CH
    End If
    Next j
    Next i

    For i = 0 To (N - 1)
    List1.AddItem X(i)
    Next i
    End Sub

    回覆刪除
  5. 佑好,
    將list的排序用於數字的部分,可以將它的數字都變成一樣的長度,
    例如將前面加0,或是,將所有的數都先將加上那個最大數,這樣大家也都一樣長度了,然後記得在輸出時,要嘛去掉前頭的0,要嘛減掉當初加上的那個數。

    回覆刪除
  6. Private Sub Form_Load()
    Me.Hide
    Dim n As String
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1
    Do While Not EOF(1)
    Line Input #1, n

    Select Case Left(n, 1)
    Case "G"
    n = Mid(n, 6, Len(n) - 5)
    Do Until Len(n) = 9
    n = "0" & n
    Loop
    List1.AddItem n
    Case "F"
    n = Right(n, 1)
    x = List1.List(List1.ListCount - n)
    Do Until Left(x, 1) <> "0"
    x = Right(x, Len(x) - 1)
    Loop
    Print #2, x
    Case "E": End
    End Select
    Loop

    Close #1
    Close #2
    End
    End Sub
    ---------------------
    in.txt
    GIVE 1
    GIVE 3
    GIVE 5
    GIVE 150000
    FIND 1
    FIND 2
    FIND 3
    GIVE 250
    GIVE 400000
    GIVE 485
    FIND 1
    FIND 2
    FIND 3
    FIND 4
    FIND 5
    END
    GIVE 587
    FIND 1
    --------------
    out.txt
    150000
    5
    3
    400000
    150000
    485
    250
    5

    回覆刪除
  7. 緣尉好,
    程式中
    case "F"
    n=right(n,1)
    你只假設找第1到第9大的而已,要是第10大以上呢?

    回覆刪除
  8. Private Sub Form_Load()
    Me.Hide
    Dim n As String
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1
    Do While Not EOF(1)
    Line Input #1, n

    Select Case Left(n, 1)
    Case "G"
    n = Mid(n, 6, Len(n) - 5)
    Do Until Len(n) = 9
    n = "0" & n
    Loop
    List1.AddItem n
    Case "F"
    n = Mid(n, 6, Len(n) - 6)
    x = List1.List(List1.ListCount - n)
    Do Until Left(x, 1) <> "0"
    x = Right(x, Len(x) - 1)
    Loop
    Print #2, x
    Case "E": End
    End Select
    Loop

    Close #1
    Close #2
    End
    End Sub

    回覆刪除
  9. 緣尉好,
    程式正確。
    所以,練習寫程式,也是要練習所謂的邏輯思考,將可能的情況給想清楚。有一點兒吹毛求疵的味道。
    明天要去大考,如果發生什麼事,會怎麼辦,對應方法?
    下雨? 塞車? 頭痛? 拉肚子? 找不到試場? 沒帶筆? 準考証不見了?
    天氣太熱,一直流汗? 眼鏡臨時破了?.....
    當然,很多時候,想太多會沒有執行力,但是,寫程式,還真是要想太多。
    這個比賽,已經將範圍給限制的很多了,但是,在正確的範圍裡,會發生的情況,還是要多想想。
    加油,一回生,兩回熟,多做題目吧。

    回覆刪除