每個人都有自己的喜歡的東西,而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
5
4
3
2
1
轉自:http://cat.nknush.kh.edu.tw/ShowProblem?problemid=d314
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來做
第一個是原始輸入
第二個跟第三個做互換用
忘了在 Case "END": 後面補 END 了
回覆刪除arro好,
回覆刪除程式雖然應該是正確,但是,你會不會用得太辛苦了些啊。
不就是個排序與找尋嗎?
你可以在每次要找第幾大的時候,去排序。
你也可以在加入的listbox中,選用「字串式的數字排序法」,讓listbox自己排序好,你只要輸出第幾項就好了。
***
所以,其實還是寫的程式不夠多,廣度還有加寬的需要哦。
幸好數字還算不大,
回覆刪除用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
佑好,
回覆刪除將list的排序用於數字的部分,可以將它的數字都變成一樣的長度,
例如將前面加0,或是,將所有的數都先將加上那個最大數,這樣大家也都一樣長度了,然後記得在輸出時,要嘛去掉前頭的0,要嘛減掉當初加上的那個數。
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
緣尉好,
回覆刪除程式中
case "F"
n=right(n,1)
你只假設找第1到第9大的而已,要是第10大以上呢?
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
緣尉好,
回覆刪除程式正確。
所以,練習寫程式,也是要練習所謂的邏輯思考,將可能的情況給想清楚。有一點兒吹毛求疵的味道。
明天要去大考,如果發生什麼事,會怎麼辦,對應方法?
下雨? 塞車? 頭痛? 拉肚子? 找不到試場? 沒帶筆? 準考証不見了?
天氣太熱,一直流汗? 眼鏡臨時破了?.....
當然,很多時候,想太多會沒有執行力,但是,寫程式,還真是要想太多。
這個比賽,已經將範圍給限制的很多了,但是,在正確的範圍裡,會發生的情況,還是要多想想。
加油,一回生,兩回熟,多做題目吧。