內容 :
「卡卡跑丁車」是一款最新型的賽車遊戲,由超可愛的角色、超酷炫的跑丁車陪你一起軋車甩尾,操作簡單容易上手,輕鬆休閒不麻煩!你只要在遊戲中,使用小技巧陷害對手,讓自己在時間內跑完全程,就可以獲得勝利唷!
在遊戲中遇到彎道時,通常需要減速以求安全過彎,而跑丁車提供了另一個選擇一甩尾!!雖然甩尾會使過彎速度下降,但累積三次甩尾後便可換取一個加速器,可以大幅縮減通過直線的時間!!可惜的是,當你囤積了兩個未使用的加速器後,再次甩尾並不會被累積計算。
卡卡是一名跑丁車玩家,由於缺乏經驗經常拿不到第一名。他最大的問題就是不清楚應該何時甩尾與使用加速器。他請你寫一個程式來提醒他在正確的地點做正確的事。
神奇的是卡卡平常通過任何彎道都需要 5 單位時間,若甩尾過彎則需平常的兩倍,也就是 10 單位時間。對於直線賽道來說,每通過 1 單位長度需要 2 單位的時間,若使用加速器則所需時間減半。
當然卡卡只會在彎道甩尾、直線使用加速器,並且一個彎道只能甩尾一次、一個加速器僅作用於一條直線賽道。
在遊戲中遇到彎道時,通常需要減速以求安全過彎,而跑丁車提供了另一個選擇一甩尾!!雖然甩尾會使過彎速度下降,但累積三次甩尾後便可換取一個加速器,可以大幅縮減通過直線的時間!!可惜的是,當你囤積了兩個未使用的加速器後,再次甩尾並不會被累積計算。
卡卡是一名跑丁車玩家,由於缺乏經驗經常拿不到第一名。他最大的問題就是不清楚應該何時甩尾與使用加速器。他請你寫一個程式來提醒他在正確的地點做正確的事。
神奇的是卡卡平常通過任何彎道都需要 5 單位時間,若甩尾過彎則需平常的兩倍,也就是 10 單位時間。對於直線賽道來說,每通過 1 單位長度需要 2 單位的時間,若使用加速器則所需時間減半。
當然卡卡只會在彎道甩尾、直線使用加速器,並且一個彎道只能甩尾一次、一個加速器僅作用於一條直線賽道。
輸入說明 :
測資包含多組測試資料,第一列有一個整數 T 表示接下來有幾組測試資料。每組測試資料表示一場競賽的全程路線,其第一列有一個整數 N ,代表接下來有幾條直線賽道,相鄰兩個直線賽道間恰有一個彎道。下一列有 N 個非負整數,依序給出了每條直線賽道的長度。起點為第一條直線的首端,終點為最後一條直線的末端,賽道的總長度不會超過 231 − 1 (1 ≤ N ≤ 10000)。
輸出說明 :
對每筆測試資料輸出卡卡到達終點所需的最短時間。
範例輸入 :
2
5
10 10 10 10 10
5
10 10 10 40 10
範例輸出 :
120
155
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中的數 )
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
終於寫好了 ... 弄好久的題目
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
Varro好,
回覆刪除你還是忘了function和sub的區別。
function會用function的名稱傳回一個值。
而sub只是做一段副程式,
而之所以寫程副程式,
是說這一段副程式可能在整個程式中會出現很多次,所以用副程式的寫法,清楚而減少重複寫程式的部分。
**
但是你的函數,一沒傳回值,二,那個參數n,a沒什麼意義吧。
還有,你的程式,跑1組以上的輸入呢?
那個x=split(L)的部分,會出錯嗎?
緣尉好,
回覆刪除程式繞來繞去,應該是正確的。
(所以,上面arro的那個問題,應該也是正確)
(還有名字的地方,多了一個v,sorry貼的時候出了小錯誤)