Codeforces科學刷題指南,一圖一表便夠了
阿新 • • 發佈:2018-12-24
簡要介紹如何科學地刷演算法題,來提高自己解決問題的能力,並利用爬蟲抓取Codeforces的題庫,來分析題目難度以及演算法分類的關係
無論做什麼事,多嘗試、找套路、然後刻意練習都是至關重要的。對資訊科學競賽(Olympiad in Informatics)愛好者來說,找套路的關鍵就是多刷題。然而題海茫茫,單以Codeforces來說,截止2017年1月3日,總共有3206道題。換言之,如果一個人足夠勤奮,能夠一天刷三道題,那也得快三年才能把題目刷完,而且題目數量還在擴充。所以盲目的刷題簡直是浪費生命,本人從16年上半年一直按照題目解決人數從高到低排序,不斷的刷水題。顯然易見,刷水題的後果就是沒有長進,熟悉的還是熟悉,不懂的還是不懂,唯一讓自己開心的就是刷題數量的累積。所以科學刷題的本質在於不斷挑戰新高度,在一個平臺練習足夠久足夠熟練之後,就要進入下一個難度平臺。為了方便大家,我把Codeforces上截止2017年1月3日的所有題目的基本資訊用爬蟲收集了下來,並存儲到excel裡。更進一步,本文試圖分析不同演算法在不同難度等級上的出現頻率分佈,以及不同演算法在不同難度等級上被解決次數的分佈。最後,我會簡要介紹的我的刷題觀,以及如何爬取Codeforces上的資訊。
先說結論
一張圖
一張表
我的刷題觀
- 如果想提升自己的思維能力 ,可以按照AC率或者解決人數由低到高二分查詢匹配自己當前水平難度的題目,然後適當挑戰高難度題(二分時間複雜度是 O(logN) ,至少比從易到難的 O
- 如果想鞏固某一專題 ,那自然應該按照tag來刷題,但是因為所用的方法在求解前已知,不太利於思維能力的提升
- 如果什麼都不懂 ,那麼建議隨機刷題,一來可以漲見識,二來進步空間比較大
- 如果想提高AC率或者增加自信 ,那麼建議刷水題
- 混搭以上策略 ,比如針對某一專題,然後用二分查詢來選擇問題求解
再有個建議,題目如果太難超過自己當前能力的話,嘗試一定時間後還是老老實實看題解吧,人與人之間還是有天賦差別的,但區別在於經驗可以慢慢積累。特別是即使做對題之後,還要想盡辦法看有沒有提高的餘地,並參考別人的程式碼,看如何精簡程式碼以及精簡時間空間複雜度。
如何用爬蟲獲取資訊
必要的庫
1: import re |
爬取Codeforces的所有演算法題
1: #%% retrieve the problem set |
標記已解決的演算法題
1: #%% mark the accepted problems |
輸出爬取資訊到csv文字
1: #%% output the problem set to csv files |
分析題目難度以及演算法分類的關係
1: #%% analyze the problem set |