2011年5月20日 星期五

卡卡跑丁車

內容 :
  「卡卡跑丁車」是一款最新型的賽車遊戲,由超可愛的角色、超酷炫的跑丁車陪你一起軋車甩尾,操作簡單容易上手,輕鬆休閒不麻煩!你只要在遊戲中,使用小技巧陷害對手,讓自己在時間內跑完全程,就可以獲得勝利唷!
  在遊戲中遇到彎道時,通常需要減速以求安全過彎,而跑丁車提供了另一個選擇一甩尾!!雖然甩尾會使過彎速度下降,但累積三次甩尾後便可換取一個加速器,可以大幅縮減通過直線的時間!!可惜的是,當你囤積了兩個未使用的加速器後,再次甩尾並不會被累積計算。
  卡卡是一名跑丁車玩家,由於缺乏經驗經常拿不到第一名。他最大的問題就是不清楚應該何時甩尾與使用加速器。他請你寫一個程式來提醒他在正確的地點做正確的事。
  神奇的是卡卡平常通過任何彎道都需要 單位時間,若甩尾過彎則需平常的兩倍,也就是 10 單位時間。對於直線賽道來說,每通過 單位長度需要 2 單位的時間,若使用加速器則所需時間減半。
  當然卡卡只會在彎道甩尾、直線使用加速器,並且一個彎道只能甩尾一次、一個加速器僅作用於一條直線賽道。
輸入說明 :
測資包含多組測試資料,第一列有一個整數 T 表示接下來有幾組測試資料。每組測試資料表示一場競賽的全程路線,其第一列有一個整數 N ,代表接下來有幾條直線賽道,相鄰兩個直線賽道間恰有一個彎道。下一列有 N 個非負整數,依序給出了每條直線賽道的長度。起點為第一條直線的首端,終點為最後一條直線的末端,賽道的總長度不會超過 231 − 1 (1 ≤ ≤ 10000)
輸出說明 :
對每筆測試資料輸出卡卡到達終點所需的最短時間。

範例輸入 :
10 10 10 10 10 
10 10 10 40 10
範例輸出 :
120 
155

5 則留言:

  1. 1.先讀入所有的直線數為N
    2.讀入直線長度,並從0到N個依序放入X陣列
    3.宣告(N-1)個陣列P,並將其值都歸零
    4.從X陣列中找未使用過的最大數K
    5.如果 K>=15 且 陣列P(1到X)中"0"的個數 >=3 則由右至左將3個P陣列值設為"1",並將X記入List1
    6.直到找不到>=15的K前,再從第4點開始執行
    7.計算輸出結果 ( 直線數*2 + 彎道數*5 + 甩尾數*5 - 陣列M中的數 )

    回覆刪除
  2. Dim X
    Dim P
    Dim Y
    Dim ans As Integer
    Dim m


    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, ef
    For i = 1 To ef
    Input #1, N
    Line Input #1, L
    X = Split(L)
    P = Split(L)
    Y = Split(L)
    Print #2, AC(N)
    Next



    Close
    Close
    End
    End Sub

    Function AC(a)
    ans = 0
    List1.Clear
    Dim K, Kt As Integer, Kc


    For i = 0 To UBound(P)
    P(i) = 0
    Y(i) = 0
    Next

    RE:
    For ii = 0 To UBound(X)
    For i = 0 To UBound(X)
    If X(i) >= K And Y(i) = 0 Then K = X(i): Y(i) = 1: Kt = i: Exit For
    Next
    Next

    If K >= 15 Then
    Kc = 0
    For i = 0 To Kt - 1
    If P(i) = "0" Then Kc = Kc + 1
    Next

    If Kc >= 3 Then

    List1.AddItem K


    m = 0


    For i = Kt - 1 To 0 Step -1
    If P(i) <> "1" Then P(i) = "1": m = m + 1
    If m = 3 Then Exit For
    Next

    K = 0
    End If

    GoTo RE:
    Else

    '7

    For i = 0 To a - 1
    ans = X(i) * 2 + ans
    Next


    ans = ans

    ans = ans + (a - 1) * 5
    ans = ans + List1.ListCount * 5 * 3

    For i = 0 To List1.ListCount - 1
    ans = ans - List1.List(i)
    Next

    Print #2, ans

    End If


    End Function

    /////////////

    輸入

    1
    9
    20 10 20 10 20 10 80 5 50

    輸出

    390

    終於寫好了 ... 弄好久的題目

    回覆刪除
  3. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1

    Input #1, a
    For ii = 1 To a
    Input #1, n
    Line Input #1, b
    x = Split(b) '各直線
    s = ""
    For i = 1 To n - 1
    s = s & "0 "
    Next
    p = Split(Left(s, Len(s) - 1)) '彎道數
    q = Split(s & "0") '是否被選取過
    ans = BigAcc(x, p, q)
    Print #2, ans
    List1.Clear
    Next

    Close #1
    Close #2
    End
    End Sub
    Function BigAcc(a1, b1, c1)
    ne:
    aw = 0
    For i = 0 To UBound(a1)
    If aw < Val(a1(i)) And c1(i) <> 1 Then aw = Val(a1(i)): bi = i
    Next
    c = 0: cc = 0
    If aw < 15 Then GoTo te
    For i = 0 To bi - 1
    If b1(i) = "0" Then cc = cc + 1
    Next
    If cc >= 3 Then
    For i = bi - 1 To 0 Step -1
    If b1(i) <> 1 Then b1(i) = 1: c = c + 1
    If c = 3 Then Exit For
    Next
    List1.AddItem aw
    c1(bi) = 1
    GoTo ne
    Else
    c1(bi) = 1
    GoTo ne
    End If
    te:
    For i = 0 To UBound(a1)
    su = su + 2 * Val(a1(i))
    Next
    For i = 0 To UBound(b1)
    If b1(i) = 1 Then mm = mm + 1
    Next
    su = su + (UBound(b1) + 1) * 5 + mm * 5
    For i = 0 To List1.ListCount - 1
    su = su - Val(List1.List(i))
    Next
    BigAcc = su
    End Function
    ---------------------------
    in.txt
    3
    5
    10 10 10 10 10
    5
    10 10 10 40 10
    9
    20 10 20 10 20 10 80 5 50
    --------------------
    out.txt
    120
    155
    390

    回覆刪除
  4. Varro好,
    你還是忘了function和sub的區別。
    function會用function的名稱傳回一個值。
    而sub只是做一段副程式,
    而之所以寫程副程式,
    是說這一段副程式可能在整個程式中會出現很多次,所以用副程式的寫法,清楚而減少重複寫程式的部分。
    **
    但是你的函數,一沒傳回值,二,那個參數n,a沒什麼意義吧。
    還有,你的程式,跑1組以上的輸入呢?
    那個x=split(L)的部分,會出錯嗎?

    回覆刪除
  5. 緣尉好,
    程式繞來繞去,應該是正確的。
    (所以,上面arro的那個問題,應該也是正確)
    (還有名字的地方,多了一個v,sorry貼的時候出了小錯誤)

    回覆刪除