112資訊學科能力競賽複賽心得文

2023.11.02 AM 11:30 by CBJ

這是我第二次參加學科能力競賽複賽,上一次的心得文在這裡

和上次不同,這次我從很早就開始關注學科能力競賽的時程,很順利地報名完成,結果剛好卡到學校五天的登山課程,加上前一天要去中央複試,所以只好放棄了登山課,因為陪隊老師也去登山了,所以我們學校並沒有派指導老師。

中央複試完以後,回到家也已經不早了,所以並沒有針對這次的競賽做任何練習,不過我特地挑了一件 YTP 的衣服來穿,因為去年看到別人穿 YTP 我就很緊張,所以今天該換我穿了 (X。

由於已經有過去年的經驗,所以很快的完成了報到,有別於上次的孤軍奮戰,我的同學也一起參加了這次複賽,同時也在考場遇到認識的人,透過聊天轉移心情,也許就比較不會那麼緊張。

很快的,在我們抵達不久後便正式開場,長官的組成和去年一樣,講的內容好像也跟去年一樣 XD,接著就進入到比賽準備的環節。跟去年相同,我們排成一直列前往電腦教室,我抽到的號碼是 36,和去年只差了兩號,所以蠻快就找到電腦的位置了 :>

倒數時間到,CMS 開始刷新,等待刷新完成就可以開始寫題,等了半分鐘發覺不對勁,看看隔壁,又看看後面,所有人全部都無法連線,比賽時間一度延長了十多分鐘,雖然參加了這麼多次比賽,已經把這件事當成常態,但延長了這麼久的時間,似乎是第一次見到 XD

解決了技術上的問題之後,比賽正式開始,我首先將題目全部看完,試圖先找一些比較好實作的題目來寫,接下來就請各位照著時間序來欣賞比賽吧。

首先開的是第二題,題目敘述也很簡單,請在一串數字字串中找出最大的質數子字串,長度不超過 3,因此這題只要枚舉所有長度不超過 3 的所有子字串,並轉成整數檢查是否為質數即可,至於判斷質數直接使用埃式篩建表即可。

Q2 – Accepted (10/10)

AC 了第二題之後,我回去看了一下第一題,題目的需求是找到給定區間內最大的阿姆斯壯數(https://zh.wikipedia.org/zh-tw/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0),但區間右界最大會到 10 的 10 次方,顯然沒辦法暴力做,但觀察到 0 ~ 10^10 之間的阿姆斯壯數其實非常少,所以我開始進行本機爆搜,把範圍內的所有阿姆斯壯數枚舉出來以後,就可以儲存在一個陣列裡求解了,原本想要真正枚舉到 10^10,但一直跑不出來,所以我就姑且相信測資不強,只枚舉到 10^9 左右,結果…

Q1 – Accepted (10/10)

還真的通過了,賽後朋友說他把 long long 改成 int 就過了(???),顯然是題目在搞,於是我就繼續看第三題,第三題是閱讀測驗題,題目的敘述真的讓人難以理解,完全理解了以後,有順利實作出來,卻因為輸入導致一直有怪問題,後來改成 stringstream 也一樣 (但賽後朋友跟我說他是用 stringstream AC 的 Orz),現在回想,我猜應該是因為 cin.ignore() 的關係,下午場就因為 cin.ignore() 被搞,這裡就先埋個梗。

實作了一陣子之後,我改成去寫第五題,題目的敘述也不算太難,也都有提供圖示,但我至今還是懷疑測資是爛的,詳細原因等一下就會講到。

題目是給定兩個輸入波的形狀,以及一個輸出波的形狀,想請問在規定的條件下,輸出波在哪些秒的時候是錯誤的,如果完全無誤就輸出 “PASS”,起初我先將三個波處理成單純的 01 訊號,接著就開始根據條件檢查輸出波是否符合條件,然後 debug 一下後,就通過了範例測資,於是我上傳到 CMS。

Q5 – Wrong Answer (0/10)

怪了,感覺這題應該算很好實作,所以我換成另一種寫法,先構造出正確的波,再跟輸出波一一比較,很快的改完之後,我再次上傳。

Q5 – Wrong Answer (0/10)

???,怎麼會這樣,明明程式不長,也不容易出 bug,怎麼會連一點分數都拿不到?於是我開始朝著題目可能是爛的方向去想,我決定把陣列的長度加大,至於多大,我一開始是預期每一行的長度相等 (這是題目保證的),所以設為第一行的長度,因為實驗性質,我改成取前三行最大值,結果…

Q5 – Partial Accepted (4/10)

??????,我更疑惑了,看起來測資真的不可信,於是我直接改成所有行的長度最大值,然後…

時間到,有傳送出去但還沒看到結果就結束了 (成績會照算只是我看不到分)

好,留下一個伏筆也不錯。

出場以後馬上就聽到一群人在討論第五題,結果他們說他們直接輸出 PASS 就有 4 分了 (???),那我到底在忙什麼,只能祈禱最後改了以後會過。

上午總分 10 + 10 + 4 + (可能會有的分數) = 24 + (可能會有的分數)

用完中餐以後,就開始下午場的比賽。一開始我也是先看完所有題目再開始解題,第七題感覺是個實作題,所以先丟在一旁,第八題看起來就沒什麼想法,第九題終於出現了演算法題,但是是一個不用會演算法也能猜出來的超直覺 greedy,然後我就開始實作這題了,題目也很簡單,給定兩個 20 位數的數字,每個位數可能是 0~9 或是 ?,接著給定一串包含各種奇怪字元的字串 (含空白),請在字串中挑出適當的數字填入 ?,讓兩個 20 位數的數字的加總最大,很明顯,越前面的 ? 填越大的數字會越好。

首先我為了方便,把兩個數字的每個位數分開讀取存在兩個陣列裡,這樣加總跟進位會比較方便,再來就是讀字串,很明顯那些奇怪字元沒有任何用途,因為有空白,所以要用 getline() 來讀,讀進來以後就可以把沒有意義的字元通通忽略,把有用的數字轉成整數存在一個陣列裡,接著只要把陣列排序,再由大到小分配給每個 ? 即可,實作起來也不複雜,很快就寫完主程式了,通過範例測資以後,我就直接上傳。

Q9 – Wrong Answer (0/10)

我實在找不出這份程式會錯的理由了,所以我就開始亂改,改一點點就開始上傳,然後就獲得了大量的 Wrong Answer,於是我決定跳題,先回去寫第七題。

第七題就是給定一個網站瀏覽資訊,要根據造訪日期統計每個網站在每個星期的瀏覽次數,題目也很貼心的提供將年月日轉成星期幾的公式,但有點特別的是,1 月要當成 13 月,2 月要當成 14 月來計算才會是好的,這題我直接使用二維 map 實作,撇除掉奇怪的輸入以後,實作起來並不會太難 (我反而覺得這題的考點是輸入),寫完以後就直接上傳。

Q7 – Partial Accepted (8/10)

好哦,又錯了什麼了,但我想說 8 分已經足夠好了,所以我就又回去看第九題。但很遺憾的,一直到考試接近結尾,都沒有任何有效的進展,所以我在最後十分鐘,決定回去把第七題補到 AC。

很好,我看了五秒就看出問題了,我把 Friday 打成 Thursday,我真是感謝我自己,改完以後,再次上傳。

Q7 – Accepted (10/10)

….. 我不知道該說什麼好了,時間還剩下十分鐘,所以當然繼續看第九題,一樣直到最後三分鐘,能改的都改了,還是各式各樣的 Wrong Answer,於是我開始喝水 (?),然後突然盯著 cin.ignore() 看。

啊不然把它改成 getline() 看看好了。

Q9 – Accepted (10/10)

上傳之後我就繼續喝水,沒有發現我已經 AC,還在想我還有什麼地方沒試過,然後看了一下螢幕,??????,蛤?

對,我在最後十分鐘的時候從 8 分變成 10 分,然後最後兩分鐘的時候從 10 分變成 20 分 (記分板那邊應該看得很精彩),從認命佳作到突然覺得好像有點希望,然後我就繼續喝水直到比賽結束。

下午總分 10 + 10 = 20

賽後問一些比較強的人,結果發現他們也都只拿 20,感謝出題委員把剩下兩題出得很難搞 XD,然後就回到休息區了。

整理成績的時間比午飯時間還要久 (?),可能是因為其他科目要人工批改,但資訊科一結束就有成績,所以就開始進行內部排名,我的總分是 44,已知有兩個 64,其他原本預估會比我高分的,也都只拿了 40 分 (表示他們很有良心,沒有 cout << “PASS\n” ),所以感覺機會頗大,卻又不太確定。

經過了漫長的整理成績環節,終於開始進行頒獎,首先頒發的是資訊科,念了將近 20 位佳作 (想當年我是佳作倒數第二 QQ),沒有念到我的名字,太好了,至少有前六 (為什麼會這麼肯定,因為拿 40 分的人得到佳作 XD),接著就直接從第六名開始唱名,… 第六名 … 彰化 …,我直接忍不住大喊,主辦還以為我是第六,因為我看起來比第六名還開心 (還差點請我上台領獎 … ?),接著就是我的名字,但因為太興奮撞掉手機,所以沒有錄到 QQ,總之,很幸運可以順利進到全國賽,要是比賽提早 2 分鐘結束,我就沒有今天的成績了 \|/,也似乎成為了歷屆以來,第一次進到全國賽的雲林學生!!接下來還有全國賽要準備,繼續努力!!!

最後放上成績 (我的校名被狀態壓縮了 \|/)

在〈112資訊學科能力競賽複賽心得文〉中有 2 則留言

  1. 恭喜恭喜!!!
    之前看到上一篇,覺得你好厲害,今年高一才剛開始接觸C++還太菜了,希望明年能有機會參加,好厲害好厲害ヾ(≧▽≦*)o

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *