天天看點

ACM 中的一些小技巧和一些要注意的點

1.能用c語言,盡量用c語言 ,要用c++庫函數時或要用到STL時再用c++,因為c語言一般節約空間。

2.oj題目要看清,能輸入一次案例就輸出的就盡量輸出,沒必要每一個案例用數組存,當然題目要求的話也沒辦法。

while(case--){
    scanf();
    ........
    printf();
}      

3資料大時最好用scanf和printf,以節省時間,就不要用cin和cout 了。經實踐,在大規模輸入輸出下,cin,cout效率遠遠低于scanf()和printf(),,在輸入輸出資料量很小的情況下,出于友善的原因,可以采用cin,cout,而在輸入輸出資料量比較大的情況下用scanf(),printf()比較保險,避免逾時.

4 利用好循環宏定義,

比如:

#define _for(i,a,b) for(int i=a;i<b;i++)
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define req(i,l,r) for(int i=(l);i<=(r);i++)
#define mem(a,b) memset(a,b,sizeof(a))      

用習慣了,在一定程度上可以節省時間,也可以簡化代碼

5 讀入優化

在有些情況下,時間很緊湊,資料很大,但是代碼你自認為時間效率已經很高了,或許你可以試試讀入優化,節省一下時間,你值得擁有,

首先,讀入優化這裡是隻是針對整數,getchar讀字元是非常快的,是以我們就用getchar了。getchar位于cstdio頭檔案中

詳見代碼:

template<typename Q>
void inin(Q &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    x=f?-x:x;
}      

隻針對整數情況。

輸出優化:

what??還有這種操作,好吧,我以前是聞所未聞。最近才知道的。

是用的putchar(); 輸出優化的代碼借鑒的這篇部落格的

哈哈。

輸出優化代碼:

void print(int x)//這裡當然不用實參
{
    if(x<0)//負數
    {
        putchar('-');
        x=-x;
    }
    if(x>9)//隻要x還是2位數或更多就繼續分解
        print(x/10);//這裡遞歸完後棧裡面x的每一位是倒過來的(關于遞歸,我也實在解釋不清楚,各位去看看神犇們的遞歸解釋吧)
    putchar(x%10+'0');//輸出(要把int型變為char型,加'0'即可)
}      

據說能夠快一點,在資料量特别大的時候,這個輸出優化代碼的部落客,用了10萬資料做測試,然後發現快了0.2s,也就是說200毫秒,哈哈,說不定你就差着200毫秒就ac了,你值得擁有。

6 調試,

有的時候調試是比較煩的,是以就要用到重定向了

把事先弄好的資料輸入到一個記事本中,特别是容易錯的地方,就是那些邊界問題

以讀的方式打開輸入檔案:freopen(“in.txt”,”r”,stdin);

這樣你就不用每次輸入案例進去了。

不過你送出代碼的時候一定要注釋這條代碼,不然會wrong 的,到時候我是不會背鍋的,Hhhh.

7 小細節

再寫計算公式的時候,若等式兩邊的類型不一樣要特别注意類型轉換,否常常會得到一個錯誤的結果。比如,int a,b; double c;c=a/b;若a可以整除b則答案是正确的,否在a/b的結果隻取結果的整數部分,并不會自動轉換為double類型。正确的寫法應該是c=(double)a/b,這樣才會得到正确的答案。

還有再調用一些數學函數的時候,比如floor(),應該注意的是其參數是double型的,再調用時應該寫為floor((double)a/b);否在a/b自動取整,floor函數并不起作用。

把乘法轉換成加法可以節省時間,因為計算機底層都是二進制計算的,也就是位運算,在一般情況下,計算機算加法都比算乘法更省時間。比如:log(a*b)=log(a)+log(b)

還有一些資料特别大的時候就要注意了,出題人就喜歡出其不意的yin 我,嗚嗚嗚,是以就需要将乘法轉換成除法防止溢出。比如:a/(b*c)=a/b/c 求最小公倍數時,将a*b/最大公約數,轉換成a/最大公約數*b。

8。

有的題資料範圍小但是計算量大可以用打表法

先把結果算出來儲存在數組裡,要用時直接取出來。就是用空間換時間

.圓周率=cos(0.0)

自然對數=exp(1.0)

如果要乘或除2^n,用位移運算速度快。a>>n;

9 如果有的題目資料特别大的時候,可以找找規律,畢竟有的時候真是這樣。hahaha…

10 三目運算符,也可以幫你簡化代碼,

如:

int gcd(int m,int n)

{return n?gcd(n,m%n):m;

}