天天看点

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;

}