ACM經驗分享[轉]
阿新 • • 發佈:2018-09-11
完全 分享 靈活 查找 -a 去重 運用 cin 離線
明確規則
規則:以最少的時間過題
(這意味著0ms與1000ms是一樣的)
了解規則,善用規則
雖然這個題我不會但是AC是沒有問題的
--ACRush
大力出奇跡
- 學會對拍數據,準備好對拍腳本:測試很重要;小數據很容易理解,大數據無法理解,給你也是白給
- 打表找規律,打表直接提交,離線打表+在線打表
敏銳的直覺 犀利的眼神 數學知識的靈活運用 各種姿勢打表
弄清時間復雜度,理解數據提示
讀題之後,數據的規模基本決定了算法的復雜度
通常 1e8的復雜度 是極限
1e6:n nlogn(慎用)
1e5、1e4:n nlogn n√n
1e3:nn nnlogn(慎用)
對於1000ms來說的
當然還要考慮常數系數
有時恰恰相反,看上去暴力過不了,而實際上加上一些優化之後正好能過。
卡常數
輸入輸出是整個程序的瓶頸,對於Java來說尤其如此
數據規模較大時(>1e5)
明顯減少運行時間
速度:getchar>scanf>cin
- 遞歸改寫:任何一個遞歸都可以用循環來實現,而循環比遞歸效率高
- 廣度優先效率比深度優先效率高
要用memset,而非循環進行初始化
memset(num,0,sizeof(int)*n)
memset(num,-1, sizeof num);
memset(num,0x3f,sizeof num);
memset(num,0,sizeof num);
- 預先開辟好大空間,完全不需要考慮內存釋放,自己管理開辟的內存
- 自己動手,豐衣足食。自己實現一些數據結構,如隊列、鏈式前向星、棧
掌握必要的技能
- 輸入輸出重定向
- 位操作
善用工具
- 模板,整理代碼庫
- STL:一些數據結構、小函數非常有用
int loc=lower_bound(num,num+n,value)-num;
loc:排好序的數組裏二分查找第一個>=value的下標
m=unique(num,num+n)-num;
unique將排好序的數組去重且順序不變
m:去重後的數組大小
- 使用宏
代碼速度
手速=讀題+思維+代碼
不是你編碼慢錯誤就可以少,不要把時間浪費在打字上,一有思路馬上實現、快速實現,聞斯行之,行斯到之。
善用工具是提高代碼速度的必由之路。君子生非異也,善假於物也。
ACM經驗分享[轉]