2012年11月20日 星期二

國際資訊奧林匹亞獎牌計算

參加國際資訊奧林匹亞(IOI)競賽者大約有一半的選手可以獲得獎牌。In_d.txt即為被評為可以獲獎的名單(第1欄為國家代碼,第2欄為選手姓名,第3欄為其成績),在此名單中,金、銀、銅牌的分配約為1:2:3。試寫一程式依得分高任分配獎牌。輸出包括四部分: 
由高至低排序,並將得獎類別寫在分數旁[G(金)、S(銀)、B(銅)]( 如輸出範例1)。 
獎牌分配,即獲得金、銀、銅牌的個數 (如輸出範例2)。 
得獎牌最多的國家,寫出國家代碼及獎牌 (不分類別) 數 (如輸出範例3)。 
所有得獎者分數之平均數、最高分、最低分及全距 (即最高分與最低分的差距)(如輸出範例4)。

輸入範例(in_d.txt):
RSA Bruce Merry 333
HUN Balazs Racz 250
UKR Oleksandr lotko 230
ROM Bogdan Dumitru 360
VIE Nguyen N. Huy 430
SUI Peter Kaufmann 266
CRO Frane Saric 268
ROM Radu A. Stefan 150
BLR Ivan Miatselski 226
AUS Peter Hawkins 225
SVK Jan Senko 210
BUL Svetlin Nakov 208

輸出範例1
VIE Nguyen N. Huy 430 G
ROM Bogdan Dumitru 360 G
RSA Bruce Merr 333 S
CRO Frane Saric 268 S
SUI Peter Kaufmann 266 S
HUN Balazs Racz 250 S
UKR Oleksandr lotko 230 B
BLR Ivan Miatselski 226 B
AUS Peter Hawkins 225 B
SVK Jan Senko 210 B
BUL Svetlin Nakov 208 B
ROM Radu A. Stefan 150 B

輸出範例2
G 2
S 4
B 6

輸出範例3
ROM 2

輸出範例4
263.00 430.00 150.00 280.00

2 則留言:

  1. Dim country(99), people(99), score(99), win(99), wincountry, take As String
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out1.txt" For Output As #2
    Open App.Path & "\out2.txt" For Output As #3
    Open App.Path & "\out3.txt" For Output As #4
    Open App.Path & "\out4.txt" For Output As #5
    k = 1: Min = 99999: Max = 0: maxx = 0
    Do
    Input #1, temp
    country(k) = Mid(temp, 1, 3): score(k) = Right(temp, 3): people(k) = Mid(temp, 5, Len(temp) - 8)
    Sum = Sum + Val(score(k))
    ttemp = ttemp & Mid(temp, 1, 3)
    List1.AddItem score(k) - 100000
    k = k + 1
    Loop Until EOF(1)
    k = k - 1
    tempp = k / 6: Gtake = tempp * 1: Stake = tempp * 2: Btake = tempp * 3
    Print #3, "G " & Gtake: Print #3, "S " & Stake: Print #3, "B " & Btake
    For i = 0 To List1.ListCount - 1
    For ii = 0 To k - 1
    If i + 1 <= Gtake Then take = "G"
    If i + 1 > Gtake And ii + 1 <= Stake Then take = "S"
    If i + 1 > Stake Then take = "B"
    ori = Len(ttemp)
    If ttemp <> "" Then ttemp = Replace(ttemp, country(ii + 1), ""): aft = Len(ttemp)
    win(ii + 1) = (ori - aft) / 3
    If Val(List1.List(i)) + 100000 = score(ii + 1) Then Print #2, country(ii + 1) & " " & people(ii + 1) & " " & score(ii + 1) & " " & take
    If win(ii + 1) > Max Then Max = win(ii + 1): wincountry = country(ii + 1)
    If score(ii + 1) > maxx Then maxx = score(ii + 1)
    If Val(score(ii + 1)) < Val(Min) Then Min = score(ii + 1)
    Next
    Next
    Print #4, wincountry & " " & Max
    Print #5, Int(Sum / k) & ".00 " & maxx & ".00 " & Min & ".00 " & maxx - Min & ".00"
    Close #5
    Close #4
    Close #3
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  2. Dim z(), rank(), r, go, so, bo, all, max, min As Integer
    Dim x(), y(), win As String
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out1.txt" For Output As #2
    Open App.Path & "\out2.txt" For Output As #3
    Open App.Path & "\out3.txt" For Output As #4
    Open App.Path & "\out4.txt" For Output As #5
    r = 0: g = 0: max = 0: min = 9999
    Do While Not EOF(1)
    Input #1, a
    r = r + 1
    ReDim Preserve x(r), z(r), y(r), rank(r)
    x(r) = Left(a, 3): y(r) = Mid(a, 4, (Len(a) - 8)): z(r) = Val(Right(a, 3))
    all = all + z(r)
    If z(r) > max Then max = z(r)
    If z(r) < min Then min = z(r)
    Loop
    go = r \ 6: so = r \ 3: bo = r \ 2
    For i = 1 To UBound(z)
    For j = i To UBound(z)
    If z(i) < z(j) Then
    s = z(i): z(i) = z(j): z(j) = s
    t = x(i): x(i) = x(j): x(j) = t
    u = y(i): y(i) = y(j): y(j) = u
    End If
    Next j
    Next i
    For i = 1 To (go + bo + so)
    If i <= go Then Print #2, x(i) & " " & y(i) & " " & z(i) & " G": rank(i) = 1
    If i <= (so + go) And i > go Then Print #2, x(i) & " " & y(i) & " " & z(i) & " S": rank(i) = 1
    If i <= (bo + so + go) And i > go + so Then Print #2, x(i) & " " & y(i) & " " & z(i) & " B": rank(i) = 1
    Next i
    Print #3, "G " & go: Print #3, "S " & so: Print #3, "B " & bo
    For i = 1 To UBound(x)
    For j = i + 1 To UBound(x)
    If x(i) = x(j) Then rank(i) = rank(i) + 1: rank(j) = 0
    Next j
    Next i
    For i = 1 To UBound(x)
    If rank(i) > g Then g = rank(i): win = x(i)
    Next i
    Print #4, win & " " & g
    Print #5, Format((all / r), ".00") & " " & Format(max, ".00") & " " & Format(min, ".00") & " " & Format((max - min), ".00")
    Close #5
    Close #4
    Close #3
    Close #2
    Close #1
    End
    End Sub

    回覆刪除