全國技藝競賽
DESCRIPTION
程式設計 比賽選手訓練研討. 全國技藝競賽. 研習計劃. 簡介 (0.5hr). 97 年承辦學校為鳳山商工 http://203.72.197.222:8080/JContest/ 98 年承辦學校為三信商工 http://163.32.84.66/JContest/ 99 年承辦學校為松山高商 http://www.ssvs.tp.edu.tw/tw/index.html. 競賽規則. 參加人數 (20/49 、 25/60 、 32/75) ---10/75 金手獎 可運用時間 ( 術科 3 小時 ) 成績計算規則 術科佔 70%. 評分標準. - PowerPoint PPT PresentationTRANSCRIPT
程式設計比賽選手訓練研討
全國技藝競賽
研習計劃時程 研習主題 內容
9: 00~9: 30全國技藝競賽程式設計競賽簡介
1. 競賽規則簡介2. 準備策略研討
9: 30~10:00
解題模式、解題技巧研討1. 建立標準化的解題模式2. 簡化輸入資料、輸出結
果動作3. 解題技巧研討
10: 10~11:00
競賽題型分類研討 (一 )1. 因數、質數題型2. 累加題型3. 排序題型
11: 10~12:00
競賽題型分類研討 (二 )1. 機率統計題型2. 遞迴題型3. 其他題型
簡介 (0.5hr)
• 97 年承辦學校為鳳山商工 http://203.72.197.222:8080/JContest/• 98 年承辦學校為三信商工 http://163.32.84.66/JContest/• 99 年承辦學校為松山高商
http://www.ssvs.tp.edu.tw/tw/index.html
競賽規則– 參加人數 (20/49 、 25/60 、 32/75) ---10/75 金手
獎– 可運用時間 ( 術科 3 小時 )
– 成績計算規則• 術科佔 70%
評分標準– 術科程式正確性 100%( 每題分數不一 ) 。– 術科程式每題評分只有對與錯兩種,對則給滿分,
錯則不給分 ( 即以零分計算 ) 。– 以學、術科比例合計為個人總成績,依參賽者總
成績高低決定名次。若總成績相同則以術科成績較高者為先,若術科成績仍相同,則依術科繳卷時間先者為先,若繳卷時間仍相同則依序比較配分較高題得分者為領先。
術科競賽方式– 實地上機撰寫程式。– 給予 1 組測試資料檔案 ( 包含輸入檔及其正確解
答之輸出檔 ) ,格式為文字檔。– 試卷中每一試題提供 2 組測試資料及其正確解答
以供學生測試用。
– 試題之輸出入資料均有其格式及範圍之要求,選手應依指定之格式及範圍作答。
– 執行檔執行時需直接讀取執行檔所在資料夾下的測試檔,並將其結果輸出至同一資料夾之輸出檔。( 用 vb2008 的要注意了 )
– 程式執行過程中不可有任何介面出現。• 程式設計結果各存 1 份於硬碟及隨身碟中,並請勿關
機。
歴屆選手參賽狀況研究– 成績分佈
• 98 成績• 97 成績• 96 成績• 95 成績
– 常見的狀況
95 年競賽成績
題目趨勢分析
• 依年度• 依題型• 依解法• …
準備策略 (0.5hr)
• 學會第一招就有資格當選手• 三招練熟全國技藝競賽名次在望• 多觀摩勤練習構築金牌夢
學會第一招就有資格當選手 I• 讀入資料檔案、輸出結果檔案• • VB6• Open “ 輸入資料檔名 .txt” For Input As #1• Input #1, 欄位 1, 欄位 2 ….• • Open “ 輸出結果檔名 .txt” For Ouput As #2• Write #2, 欄位 1, 欄位 2 ….• • VB2008• 只要會按「滑鼠右鍵」,系統會自動出現指令讓您
選
學會第一招就有資格當選手 II• 讀入資料檔案、輸出結果檔案• VB6• Open App.Path & "/test1.txt" For Input As #1• Open App.Path & "/result1.txt" For Output As #2
學會第一招就有資格當選手 III• 讀入資料檔案、輸出結果檔案• VB2008( 按滑鼠右鍵會自動產生 )• Dim fileContents As String• fileContents =
My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\Test.txt“)
• My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\result.txt", temStr, False)
三招練熟全國技藝競賽名次在望• 循序、選擇、迴路 • 所有題目的解題邏輯都是由這三個程式設
計結構組成,熟練加活用後,解個三題基本題,已然名次在望。 (96 年因題目較簡單,要 5 題才有名次, 95 年術科解 3 題即可擠進前 20 名,解 4 題就有選手得到第11 名, 98 年解 3 題即可得到優勝 )
多觀摩勤練習構築金牌夢• 善用資源,廣泛收集考題,多觀摩、勤練習,構築金牌夢
解題模式、解題技巧研討 (1hr)
• 界定問題分析題目需求實作驗證答案的標準流程建立
• 簡化輸入資料、輸出結果動作• 建立標準化的解題架構
標準解題架構
• Input:讀取資料檔資料至參數中• Process:利用輸入的資料運用演算方法
( 比較、交換、排序、累加… .) ,得到結果• Output:輸出結果
簡化輸入資料、輸出結果動作
比賽常用解題技巧
• 比大小• 交換• 排序• 搜尋• 累加
• 查表• 窮舉 &篩選• 遞迴• 由 3 次 (固定次
數 )推演至 n 次
比賽常見處理的資料類型• 數字處理• 文字處理• 陣列處理
• 時間與集合資料型態資料是未來的出題方向?
演繹式的解題模式•取一組資料做出一組資料處理結果輸出結果至螢幕
•改為二組資料•改為 N 組資料•套用讀入資料檔、輸出結果檔
模式,完成解題
演繹式的解題模式例 I
演繹式的解題模式例 II
演繹式的解題模式例 III
演繹式的解題模式例 IV
演繹式的解題模式例 V
演繹式的解題模式例 VI
演繹式的解題模式例 IIV
Divide-and-conquer•分裂並各個擊破•將一個大問題切割成獨立的小問題來解決,且小問題與原先問題之解決方法是一樣的,差別只在於問題的大小
Divide-and-conquer例
解題技巧研討
時間考量• 術科 180分鐘
–每題可運用時間平均為 22.5 分鐘–應先掌握基本題,再花時間解評估
需花 20 分鐘以上題目
相關的知識• 相關的知識
–基本資料結構及演算法概念–基本數學及統計學概念
常用函數函數 說明 範例 值Abs(X) 取 X的絕對值 Y=ABS(-3) Y=3
Int(X)取不大於 X的最大整數 Y=Int(3.5)
Y=Int(-3.2)Y=3Y=-4
Join(X,a)合併陣列為 以 a符號 分隔的字串
x(0) = "Hello"x(1) = "World"Y= join(x,"-")
Y = "Hello-World"
Len(X)X 的字串長度 X= “Hello”
Y=len(X)Y=5
Mid(X,a,b)
自字串 X的第 a個字起取 b個字
Y = mid(“Hello”,2,3) Y="ell"
Right(X,a) 取字串 X的右邊 a個字 Y=right(“Hello”,4) Y = “ello”
Rnd 產生 0~1之間的亂數 Y = rnd()
Split(X,a)以 a為分隔符號,將 X字串打散成陣列
X = “Hello-World”Y = split(X,"-")
Y(0)=HelloY(1) = World
UBound(X)
求陣列 X的最大註標值 Dim X(12) as IntegerY = Ubound(X)
Y = 12
Val(X) 將 X轉為數值 Y = val(“123”) Y = 123
選用 VB2008參賽的優勢與注意事項(1hr)
• 使用非承辦單位提供之軟體,需於規定日期前將原版光碟寄達承辦單位,由承辦單位審查。
• 執行檔執行時需直接讀取執行檔所在資料夾下的測試檔,並將其結果輸出至同一資料夾之輸出檔。
• 以 VB2008 參賽的優缺點
窮舉法?• 缺點
–電腦花較多的時間• 優點
– 人花較少的腦力• 比賽時,做得出來,就是好方法。• 比賽評分標準的速度,指的是選手做出來
的速度,不是電腦程式執行的速度
窮舉法例 I
窮舉法例 II
區域變數或全域變數?• 善用副程式,但因程式小,可考慮使用全域變數,節省處理參數傳遞問題。
最令人擔心的題目?• 沒有人解的出來的題目
– 當少出一題看待• 只有少數人解的出來的題目
– 總是要這樣,才方便產生前面名次吧!
• 最令人擔心的題目– 不難,但很花時間的題目– 解這一題,但耗掉大部份時間,少做好幾題。– 總是要有這樣的題目,才好區別榜上有名否
考題分類研究
因數、質數題型• s96-1 (最大公約數 12%) 6
• s93-3 (歐基里德輾轉相除法 ) 5
• s94-1 ( 程式設計分組 14 分 ) 8
• s95-6 (Ugly Number 的質因數問題 10%)
• s93-7 ( 一個數值分解成兩質數和 )
S96-1 求最大小因數• Function gcd(ByVal a, ByVal b)• While a <> b• If a > b Then• a = a - b• Else• b = b - a• End If• End While• gcd = a• End Function
S94-1 程式設計分組 (窮舉 )
• nMin = n(1)• For i = 1 To sn• If n(i) < nMin Then nMin = n(i)• Next i• • Gn = 1• For i = 1 To nMin• nFlag = True• For j = 1 To sn• If n(j) Mod i <> 0 Then nFlag = False• Next j• If nFlag = True Then Gn = i• Next i
S95-6 Ugly Number 質因數問題I
Dim n As Integer = 1
Dim ord As Integer = 0
While ord < lineArray(i)
If check(n) Then
ord = ord + 1
End If
n = n + 1
End While
S95-6 Ugly Number 質因數問題II
Function check(ByVal n) As Boolean
While n Mod 5 = 0
n = n / 5
End While
While n Mod 3 = 0
n = n / 3
End While
While n Mod 2 = 0
n = n / 2
End While•
If n = 1 Then check = True Else check = False End If End Function
S93-7 分解為兩質數和 I
Private Function checkP(a) As Boolean
checkP = True
i = 2
Do While i < a
If a Mod i = 0 Then
checkP = False
Exit Do
End If
i = i + 1
Loop
End Function
S93-7 分解為兩質數和 II
n = InputBox("n=")
For i = 2 To n / 2
n1 = i
n1f = checkP(n1)
n2 = n - n1
n2f = checkP(n2)
If n1f = True And n2f = True Then
Print n1; "+"; n2
'Exit For
End If
Next
累加題型
• s96-2 ( 字串處理 10%) 15• s94-5 ( 字串處理, 12 分 ) 17• s93-5 (隔日二倍給錢 ) 18• s93-6 (期末領回 ) 20• s95-1 ( 國際標準書碼 ISBN 的檢測 10%)
20
S96-2阿拉伯數字有幾個?• Function NN(ByVal str1)
• Dim counter As Integer = 0
• For i As Integer = 1 To str1.ToString.Length• If Mid(str1, i, 1) >= "0" And Mid(str1, i, 1) <= "9" Then
• counter = counter + 1
• End If
• Next
• NN = counter
• End Function
S93-5隔日二倍給錢 n(1) = 1
n(2) = 2
For i = 3 To 30
j = i - 1
While j >= 1
n(i) = n(i) + n(j)
j = j - 1
Wend
n(i) = n(i) * 2
Next i
For i = 1 To 30 Print " 第 "; i; " 天 "; Tab(8), n(i) s = s + n(i) Next i
S93-6期末領回 n = InputBox(" 輸入年利率 ")
k = InputBox(" 輸入年數“ )
s = 0 : i = 1
While i <= Val(k)
For j = 1 To 12
s = s + 10000
s = s * (1 + n / 12)
Next j
i = i + 1
Wend
s = Int(s * 10 + 0.5) / 10Print " 本利和 "; s; " 元 "
S95-1 ISBN檢測‘檢查是否為 0~9 數字If Mid(str1, i, 1) >= "0" And Mid(str1, i, 1) <= "9" Then
str2 = str2 & Mid(str1, i, 1) & ","
End If
‘處理最後一個字為 X情況 If Microsoft.VisualBasic.Right(str1, 1) = "X" Then s0(9) = 10
• ‘處理二層累加• Dim s1(9) As Integer
• s1(0) = Val(s0(0))
• For i As Integer = 1 To 9
• s1(i) = s1(i - 1) + Val(s0(i))
• Next
• Dim s2(9) As Integer
• s2(0) = s1(0)
• For i As Integer = 1 To 9
• s2(i) = s2(i - 1) + s1(i)
• Next
排序題型
• s96-7 ( 排序 16%) 20
• s94-7 ( 基數排序, 17 分 ) 20
• s95-5 (密碼分析 15%) 20
S96-7交換幾次?• Dim swapN As Integer = 0• For k As Integer = 1 To lineArray(i) - 1• For j As Integer = 0 To (lineArray(i) - 1) - 1• If columnArray(j) > columnArray(j + 1) Then• Dim tem = columnArray(j)• columnArray(j) = columnArray(j + 1)• columnArray(j + 1) = tem• swapN = swapN + 1• End If• Next j• Next k
S95-5密碼分析 Dim i As Integer
• For i = 1 To Len(str1)• n(Asc(Mid(str1, i, 1))) = n(Asc(Mid(str1, i, 1))) + 1• Next• For i = 0 To 25• n(65 + i) = n(65 + i) + n(97 + i)• a(65 + i) = Chr(65 + i)• Next
• ‘ 排序• Dim j As Integer
• For i = 65 To 65 + 25 - 1
• For j = i + 1 To 65 + 25
• If n(i) < n(j) Or (n(i) = n(j) And a(i) > a(j)) Then
• tem1 = n(i)
• n(i) = n(j)
• n(j) = tem1
• tem2 = a(i)
• a(i) = a(j)
• a(j) = tem2
• End If
• Next
• Next
機率統計題型• s94-2 (購買花朵 10 分 ) 20
• s96-5 (最小距離 14%) 20
• s94-4 (最小離差 16 分 ) 20
• s94-6 ( 相關係數, 18 分 ) 20
• s96-3 (積木方塊 13%) 20
• s96-6 ( 排列組合 17%) 20
• s93-2 ( 模擬不公平骰子 ) 20
S94-2購買不同價格花朵
q50 = 0
If n >= 50 Then
q50 = 1
n = n - 50
End If
q10 = 0
While n >= 10 q10 = q10 + 1 n = n - 10 Wend q5 = 0 If n >= 5 Then q5 = 1 n = n - 5 End If q1 = n
S96-5 相鄰二數最小距離Dim minD As Integer = Math.Abs(columnArray(0) - columnArray(1))
For j As Integer = 1 To lineArray(i) - 1 - 1
If Math.Abs(columnArray(j) - columnArray(j + 1)) < minD Then
minD = Math.Abs(columnArray(j) - columnArray(j + 1))
End if Next j
S94-4最小離差• For i = 1 To n - 1
• For j = i + 1 To n
• If a(i) > a(j) Then
• tem = a(i)
• a(i) = a(j)
• a(j) = tem
• End If
• Next j
• Next i
• For i = 1 To n / 2
• s1 = a(i) + a(n + 1 - i) & "=" & a(i) & "+" & a(n + 1 - i)
• s2 &= s1
• Next i
S94-6 相關係數For i = 1 To n
Input #1, x(i), y(i)
Next i
For i = 1 To n
SumX = SumX + x(i)
Next i
xa = SumX / n
For i = 1 To n
SumY = SumY + y(i)
Next i
ya = SumY / n
For i = 1 To n up = up + (x(i) - xa) * (y(i) - ya) down1 = down1 + (x(i) - xa) ^ 2 down2 = down2 + (y(i) - ya) ^ 2Next i
r = up / ((down1 ^ 0.5) * (down2 ^ 0.5))
S96-3積木方塊• Dim sum As Integer = 0
• For j As Integer = 0 To lineArray(i) - 1
• sum = sum + columnArray(j)
• Next j
• Dim avg As Integer = sum / lineArray(i)
• Dim sumD As Integer = 0
• For j As Integer = 0 To lineArray(i) - 1
• sumD = sumD + Math.Abs(columnArray(j) - avg)
• Next j
S93-2 模擬不公平骰子 v = Rnd()
Select Case v ' 判斷 v 的值。 Case Is <= 1 / 63 ' 值在 0 到
1/63 之間。 n(1) = n(1) + 1
Print "1";
Case 1 / 63 To 3 / 63 ' 值在 1/63 到 3/63 之間。
n(2) = n(2) + 1
Print "2";
Case 3 / 63 To 7 / 63 ' 值在 3/63 到 7/63 之間。
n(3) = n(3) + 1
Print "3";
Case 7 / 63 To 15 / 63 ' 值在 7/63 到 15/63 之間。 n(4) = n(4) + 1 Print "4"; Case 15 / 63 To 31 / 63 ' 值在 15/63 到 31/63 之間。 n(5) = n(5) + 1 Print "5"; Case Else ' 其它數值。 n(6) = n(6) + 1 Print "6"; End Select
遞迴題型• s95-8 (費氏數 10%)20
• s95-4 ( 數學遊戲 15%) 20
• s95-3 (N階層數 10%) 20
• s96-4 ( 數學遊戲 18%) 20
S95-8費氏數• Function FN(ByVal n)
• If n <= 1 Then
• FN = n
• Else
• FN = FN(n - 1) + FN(n - 2)
• End If
• End Function
集合資料型態題• Q97-3 (黑盒子 12%)
• S95-2 ( 過橋問題 15%)
Q97-3 (黑盒子 12%)
• Dim rStr = ""• Dim aList1 As ArrayList = New ArrayList• Dim fileContents As String• fileContents =
My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\Test3.txt")
• Dim row = Split(fileContents, vbNewLine)• For i = 0 To UBound(row)• Dim data = Split(row(i), " ")
• If data(0) = "Insert" Then
• aList1.Add(Val(data(1)))
• End If
• If data(0) = "Inquire" Then
• aList1.Sort()
• aList1.Reverse()
• If data(1) <= aList1.Count Then
• rStr = rStr & aList1(Val(data(1)) - 1) & vbNewLine
• End If
• End If
• If data(0) = "Clean" Then• aList1.Clear()• End If• If data(0) = "END" Then• Exit For• End If• Next• MsgBox(rStr)
S95-2 ( 過橋問題 15%)
• Dim dlist As New ArrayList
• Dim slist As New ArrayList
For i As Integer = 1 To dataN• slist.Add(Val(recArray(recIndex + i)))• Next• slist.Sort()
• :
• bridge(slist, dlist, slist.Count)
• Sub bridge(ByVal slist, ByVal dlist, ByVal n)• If n = 2 Then• slist.sort()• resultStr = resultStr & slist(0) & " " & slist(1) &
vbNewLine• total = total + IIf(slist(0) > slist(1), slist(0), slist(1))• dlist.Add(slist(0))• dlist.Add(slist(1))• slist.Remove(slist(1))• slist.Remove(slist(0))
• Else• slist.Sort()• If n = 3 And (slist(2) - slist(1)) > (slist(1) - slist(0)) Then• slist.Reverse()• resultStr = resultStr & slist(1) & " " & slist(0) & vbNewLine• Else• resultStr = resultStr & slist(0) & " " & slist(1) & vbNewLine• End If•
• total = total + IIf(slist(0) > slist(1), slist(0), slist(1))• dlist.Add(slist(0))• dlist.Add(slist(1))• slist.Remove(slist(1))• slist.Remove(slist(0))• dlist.Sort()• resultStr = resultStr & dlist(0) & vbNewLine•
• total = total + dlist(0)
• slist.Add(dlist(0))
• dlist.Remove(dlist(0))
• bridge(slist, dlist, n - 1)
• End If
其他題型
• s94-3 (連分數 13 分 ) 20
• s95-7 (英文造句 15%) 20
• s93-4 ( 數量不同盤子裝箱 ) 20
• s93-1 (2 位數乘法 ) 20
S95-7英文造句• Sub senten(ByRef InArray)• Dim temStr As String• Dim 主詞 () = {"I", "He", "She", "They", "Mary", "John"}• Dim 主詞第三人稱單數 () = {"He", "She", "Mary", "John"}• Dim 及物動詞 () = {"love", "like", "see", "find"}• Dim 受詞 () = {"me", "him", "her", "them", "Mary", "John"}• Dim 反身代名詞 () = {"myself", "himself", "herself", "themselves", "herself",
"himself"}• For i As Integer = 0 To 2• Dim f1 As Integer = Array.IndexOf(受詞 , InArray(i))• If f1 >= 0 Then• temStr = InArray(i)• InArray(i) = InArray(2)• InArray(2) = temStr• End If
• Dim f2 As Integer = Array.IndexOf( 及物動詞 , InArray(i))
• If f2 >= 0 Then
• temStr = InArray(i)
• InArray(i) = InArray(1)
• InArray(1) = temStr
• End If
• Next i
• If Array.IndexOf(受詞 , InArray(2)) = Array.IndexOf(主詞 , InArray(0)) Then InArray(2) = 反身代名詞 (Array.IndexOf(受詞 , InArray(2)))
• If Array.IndexOf(主詞第三人稱單數 , InArray(0)) >= 0 Then InArray(1) = InArray(1) & "s"
• End Sub
S93-4 數量不同盤子裝箱• Dim b(10, 2) As Integer
• For i = 1 To 9
• b(i, 1) = 2 ^ (i - 1)
• Next i
• b(10, 1) = 489
•
• n = 717• ns = n• For i = 10 To 1 Step -1• If n >= b(i, 1) Then• b(i, 2) = b(i, 2) + 1• n = n - b(i, 1)• End If• Next i• •
• For i = 10 To 1 Step -1
• If b(i, 2) <> 0 Then
• Print "("; i; ")"; b(i, 1)
• End If
• Next i
考前猜題• 考古題• 迷宮• 邏輯推理題• 排列組合• 最短路徑• 模擬• 河內塔• Big(O)
• 一維、二維表格轉換• 數獨 ( 出題、解答、錯誤查核 )
• 樂透 (號碼模擬、簽牌模擬 )
• 矩陣 ( 加、減、乘 )
• 大數 ( 加、減、乘、除 )
• 集合資料處理• 約瑟夫求救
考前猜題 II
• 方程式求解• 日期資料型態題• 稀疏矩陣• 魔術矩陣• 多項式相加• 薄餅排序
新的評分標準?
• 執行程式較快• 程式較簡潔• Big(O)?
– O(nLogN) => 30– O(N*N) => 20–窮舉 => 10
新的比賽模式?
請指教!