1. 程式人生 > >在成都七中的寒假資訊競賽集訓總結

在成都七中的寒假資訊競賽集訓總結

集訓二總結

              ———動態規劃

假期時光飛逝,轉眼,第二波集訓已悄然降臨。回望剛剛經歷的兩天,我認為有必要進行一次總結。
這兩天,主要由陳楷予學長帶領我們進行動態規劃的深入學習。
動態規劃,關鍵在於把握題目中的資訊。由於題目本身的性質導致動態規劃題難以使用暴力方法解決,就算暴力也通常只有很少的分數。找出轉移方程是關鍵,正確選取最優子結構也是關鍵,並且要適當結合資料結構和搜尋的知識。只有這樣才可以靈活地運用動態規劃,使不同的方程或是演算法發生關係(產生聯絡)。
第一天,先簡要複習了一下動態規劃的已學過的知識點。以前的動態規劃主要是針對一串數的選擇與不選擇問題,包括各種揹包與各種樸素演算法,但是隨著資料範圍的擴張,很可能造成超時或者爆空間的情況。然後進行了LCS的學習(最長公共子序列)以及LIS的學習(最長不下降子序列),但時間複雜度由n^2下降至nlogn。主要的方法有:二分+單調棧和樹狀陣列。接下來是樹形DP,包括求樹上最長連、最多任意不相連的點和樹上揹包。主要方法是用DFS加上一個轉移方程來取代普通的迴圈操作,這樣就可以確定樹上節點的選取或者不選取,自然確定狀態。然後是圖上DP,包括求有向無環圖最長路徑、FLOYD以及次短路徑的求取。
第二天,首先補充了樹形DP,此時要進行題目的抽象與剝離,使其變成“通俗易懂”的題目,再來動態規劃。資料結構優化DP,將動態規劃與資料結構結合。狀態壓縮DP,將原先的flag陣列打標記的工作,用一個數的二進位制數的1或0狀態來代替,加上位運算,大大縮減了時間空間複雜度,並且可以方便地查詢並且更改某一個特定位置上的狀態並且保證之前沒有而不用for一遍。只是位運算的原理要搞懂。數位DP嘛。。。。
現在的動態規劃已經不是單純的針對數的探究與選取,更多的是與棧、佇列、樹等資料結構的結合,把曾經單一的數字轉變成節點、子樹、甚至森林裡的一棵樹。總而言之,動態規劃演算法屬於遞推演算法,並且這個演算法適用的問題必須具有最優子結構,利用區域性最優解來推導全域性最優解。
(啊,我的動態規劃怕是廢了。)

集訓三總結

           ——字串

又過了兩天。Time Flies Very Fast.
字串的學習緊接著動態規劃,老實說,這部分確實挺難得,同時也具有難度,確實需要聆聽與思考。
字串,關鍵在於將字串與各種資料結構結合。一個字串的性質,當然要考慮到自身的規律,也要考慮到資料結構的運用。你說,這一個字串,怎麼就這麼神奇呢?後來陳凱予學長就給我說啊,說NOIP已經確定啦,字串一定會考!所以說,這一部分很重要。
首先學習的是Hash函式、Hash雜湊性質以及Hash的儲存。運用這個方法可以快速判斷多個字串是否相同。接著學習了字典樹,也就是Tire樹。這個演算法可以解決“給出一個字串t,求以此串為字首的單詞有多少個”、“判斷單詞中是否存在某個串為另一個串的字首子串”等問題。Tire時間複雜度是o(len),但是空間複雜度是o(n*len),消耗較大。然後學習的是KMP演算法,可以用來解決“求t在s中的匹配次數”、“最多能在s中提取出多少個t”、“求s的最小覆蓋子串”、“求出現次數”等問題。KMP是針對兩個字串,檢視一個有沒有另一個子串的演算法。下面是AC自動機,在Tire樹上加上fail指標,也可以說是Tire樹和KMP。

集訓四總結

               ——數論

馬上就要結束競賽的寒假訓練了。
在這幾天裡,資訊競賽變成了數學競賽,丁堯堯學長為我們講解了資訊學需要的數論知識,也就是數學。當然,由於這部分理論偏多,並且與資訊學的關聯不算大,所以理解起來有一定的難度。我很慶幸,自己撐過了這關。
首先我們學習了組合數與排列數。從n個物件中選m 個排成一列的方案數稱作排列數,記作P(n,m)。如果n=m,則稱為全排列,記作P(n)。從n 個物件中選擇m 個的方案數稱作組合數,記作C(n,m)。這裡還涉及到了可重排列與迴圈排列、夾棍法以及卡特蘭數列。接下來是容斥原理,這個類似於抽屜原理。然後是快速冪(快速乘),如果我們要計算a的n次方,那麼我們可以將n寫成二進位制形式,然後將a的n次方拆成一些a的2i此方的乘積,而後者可以遞推來算。然後是lcm、gcd以及exgcd。兩個整數公共的約數稱為公約數,如果這兩個數不同時為0, 那麼他們中就存在最大的一個公約數,稱為最大公約數,記作gcd(a,b)。兩個不為0 的整數公共的倍數稱為公倍數,其中最小的正公倍數記為最小公倍數,記作lcm(a,b)。
擴充套件歐幾里得演算法。這個可以證明輾轉相除法與唯一分解定理。gcd(a,b)=ax+by。二元不定方程的解法十分靈活。接下來是同餘,同餘是指兩個數除以某個數有相同的餘數這一個重要的關係。儘管還學習了尤拉函式、求逆元以及中國剩餘定理,但是由於我本身對這些知識的掌握就不算很好,加之知識點龐雜繁瑣,在這裡就不過多介紹。(可以參考講義上的知識)
數論是一大難點,難懂,並且對思維的速度與準度有極高的要求。就我個人的情況而言,想要在短短的幾天之內搞懂這些知識是不可能的。所以我會在日後多加理解複習,雖然難,但畢竟這些知識是基礎。

考試專題總結

           ——關於應試技巧及方法

回望這個寒假,我一共經歷了八次考試。這八次考試,我經歷不同難度,不同出題風格,不同時間安排以及不同的考試氛圍。這給了我非常多的經驗,讓我之前對考試的畏懼心理極大的消散。記得剛剛考試我經常爆零,拿到了題目不知所措,打好了所知道的程式,就不知道幹嘛了。我的成績由較差到較好,最終穩定在班級十名左右,我認為有以下幾個原因。
首先,平時與同學的交流。某種意義上來說,與同學進行交流比與老師交流更加重要。同學的問題也許自己也有,解決他的問題的同時,也就逼迫自己去解決自己身上存在的問題。並且同學之間可以沒有顧慮的表達自己的疑惑以及知識漏洞,可以平等的分享經驗方法。這給了我非常多的知識,不僅是理論知識,更重要的是人生的經驗。
其次,該暴力就暴力。記得有次考試,我做不出最後一題,無奈之下選擇暴力方法。也不知道是誤打誤撞還是靈感一現,我想出的暴力方法就是正解的“退化版”和“通俗版”,於是那道題我用非常樸素的方法暴力對了60分。這對於一道資訊競賽的考試題,還是最後一題是相當不錯的分數了!慶幸之餘,我也因為嚐到了暴力的甜頭而走上“不歸路”(儘管很管用)。暴力的好處就是不會爆零,並且說不定你辛辛苦苦打了兩個小時的“正解”,結果還是拿了零分,還不如提早決定,果斷放棄,開始暴力,並且想盡一切方法對程式碼進行各種各樣的優化,包括空間、時間。你可以選擇分段處理,利用給出的資料範圍強勢騙分;也可以用超時程式碼打表,最原始的“時間換時間”方法,迴歸本真;你甚至可以全部輸出“No”,或者全部輸出“1”,甚至利用資料的邊界和特殊資料(0,1,100000等),強力腦算!不管什麼方法,拿到分了就行。所以我就想到了中國的一位偉大的改革開放總設計師所說的話“不管白貓黑貓,只要能抓到老鼠的,就是好貓!”
然後,拿到試題通讀試卷,大概想出所需的演算法,不會的果斷放棄。不要拿著就開跑,正所謂“工欲善其事,必先利其器”、“欲速則不達,見小利則大事不成也”。
最後,學會善於自主的、靜態地、查錯。儘管我會用偵錯程式,但是我很少在實戰中使用它。一個是因為它比較麻煩,並且變數一多,容易搞不清楚過程。二一個,是因為我偵錯程式用的還不是很熟練,花費的時間巨大,還不如自己靜態查錯來得快。事實證明,靜態查錯在某些方面確實有優勢,但如果程式碼太長,靜態查錯無法快速進行時,就需要適當利用偵錯程式了。
總體來講,考試和學習是一個相反而又相同的過程。先學好,才可以考好。考試是不全面的,考題指示方向,最重要的是整理筆記,記清楚演算法模板,而不是單純的做題。僅僅做題,有人做一次,以後都會了;有人做十次,還是不能對。只有分清自己是“考生”還是“學生”,確定自己的地位與目標,才可以在學習與考試中都做到較為成功。

ACM比賽

               ——首次正大光明的討論

今天是2017年2月12日,我參加了人生首次ACM比賽。
隊友:朱聞笛、李家童。戰隊名稱:theljt。
私下裡,我們三個是非常要好的朋友,自然在比賽過程中有著精妙的默契。我們分工合作,一人兩題,高效又準確。巔峰時期達到了第二名,儘管最後只得了第五,不過相對於我們的實力,這個成績還算正常。這種比賽,不僅刺激(excited!),而且有效地學習了知識。
希望還有這種比賽,希望還可以戰鬥下去。

尾聲

      ——說點廢話

資訊學帶給我的,不只是知識層面的東西,更是精神層面的寶藏。很感激自己,能夠堅持下來。
作為一名學生,一名七中學子,一名競賽生,一定要學會思考。思考是無可替代的,再忙也要思考,不能被別人帶著走,要形成自己的節奏與習慣。忙,但是不能假忙。時間花在正確的事情上,不要讓不該做的事佔據了大部分空間與時間。
在之前的總結中,我並沒有在之前的總結中大量的總結知識層面的東西,而是在沒有大量的總結知識層面的東西時更注重一些經驗性以及概念性的東西。我沒有附上一條程式碼,因為個人覺得沒必要,而且會讓總結變醜(真的,我強迫症晚期,估計是沒救了)。這篇總結是以故事的文字格式寫的,段落不多,文字較為密集,很少明確區分1234的順序。更偏重自我的看法。知識總結多了,就應該叫做“百度”,叫做“知識薈萃”,叫做“演算法集錦”,而不是“自己的總結”。由於這篇總結是與其它文獻資料配合使用的,所以在日後的複習中,可以直接參考其他檔案上的知識(各位學長的講義及程式碼模板,考試的程式碼,甚至網路上的部落格以及評測網站的交流平臺)。
我還有大量的知識沒有學,還有很長的路要走。希望自己可以堅持下去,和我親愛的同學和敬愛的老師一起,越走越遠!
加油!
這是啥???