1. 程式人生 > >ACM經驗分享[轉]

ACM經驗分享[轉]

完全 分享 靈活 查找 -a 去重 運用 cin 離線

明確規則

規則:以最少的時間過題
(這意味著0ms與1000ms是一樣的)

了解規則,善用規則

雖然這個題我不會但是AC是沒有問題的
--ACRush

大力出奇跡

  • 學會對拍數據,準備好對拍腳本:測試很重要;小數據很容易理解,大數據無法理解,給你也是白給
  • 打表找規律,打表直接提交,離線打表+在線打表
    敏銳的直覺 犀利的眼神 數學知識的靈活運用 各種姿勢打表

弄清時間復雜度,理解數據提示

讀題之後,數據的規模基本決定了算法的復雜度

通常 1e8的復雜度 是極限
1e6:n nlogn(慎用)
1e5、1e4:n n
logn n√n
1e3:n
n 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經驗分享[轉]