《算法竞赛入门》前五章摘录以及想法

1.算法竞赛中,输入前不要打印提示信息。输出完毕后应立即终止程序,不要等待用户按键,因为输入输出过程是自动的,没有人工干预。

#include<cmath> //cpp
floor(m + 0.5) == m


2.关于圆周率PI,不要使用math.h中定义的常量M_PI,因为这个常数不是ANSI C的标准(可以用 gcc -ansi测试),可以用以下语句进行定义PI:

#include<cmath>  //cpp
const double pi = 4.0 * atan(1.0);


3.浮点数是否为一个整数的判断:

#include<cmath> //cpp
floor(m + 0.5) == m

函数floor(x)返回x的整数部分,那为什么不直接比较floor(m)和m呢?

原因在于: 浮点数的运算(和函数)有可能存在误差----不一定存在,但经常都会。


4.关于手动测试程序运行时间:

可以使用以下语句:

#include<time.h> //c
printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);

clock()返回程序目前为止运行时间,除去CLOCKS_PER_SEC之后得到的值以“秒”为单位。

注意:为了避免输入数据的时间影响测试结果,我们使用一种称之为管道的小技巧。

Windows:echo 输入参数 | 程序名,例如:echo 123 | abc

Linux: echo | ./abc 注意 ./ 因为Linux下一般当前目录不是可执行文件的搜索路径。


5.对于不确定多少个case输入的的题目,一般会使用以下语法输入:

while(scanf("%d",&a) == 1)
{...}

可以使用以下命令结束:

windows:Ctrl + Z

Linux: Ctrl + D


6.输入输出重定向(可以用fopen,比较灵活,详细解释查看书P26 - P27)

#define LOCAL
#ifdef LOCAL
	freopen("data.in", "r", stdin);
	freopen("data.out", "w", stdout);
#endif


7. 64位整数。

long long 类型。

占位符一般用 %lld 在Window的MinGW的gcc和VC6需要用%I64d 


8.在C++程序中使用C语言头文件,请出去扩展名.h,并在最前面加上小写字母c。这是C++标准。


9.输入输出,一般来说,一般输入量不是很大的,C++的cin和cout基本可以满足题目需求,但输入量特大的时候,cin和cout的效率就没有C的scanf和printf高了。所以,建议:

数据少:C++标准输入输出。

数据多:C标准输入输出。


10.变成不是看书看会的,也不是听课听会的,而是练会的。     所以呢...还是多做题!!!


11.对于比较大的数组,最好定义为全局变量(编译时就会给数组分配好空间了),而定义在函数中的话,会占用太多栈空间,非常容易到处异常退出。


12.初始化数组的时候,用memset的效率比较高(可查阅cpprefrence)。


13.数组定义时,长度最好比稍大一点点,防止越界;对数组操作时,进行下标预判,如果可行就执行想要的代码,避免做完了就后悔,这种“悔棋”代价比较大。


14.scanf("%s",str);字符串输入变量前木有&喔,这里注意一下。


15.整型,浮点型转化为字符串的时候,使用sprintf,不要使用itoa,itof,因为不是ansi c标准。


16.关于读入单个字符或字符串需要注意的地方,可以查看书P41 - P42.


17.对于字符串的一些判断,可以引用C语言的ctype.h头文件,百度一下就可以有详细的函数介绍,这个头文件里面的函数非常好用,例如isalpha(c)判断c是否为字母,这样就不需要手工自己写判断了,提高编写代码的效率...哈哈,又体现了软件工程中的代码复用的概念了....


18.转义字符: \n换行  \\反斜杠 \"引号 \0 空字符 \o \oo \ooo八进制  \xh 十六进制(h为十六讲你知数字串)


19.记住一个数:(2^32) - 1 = 4294967295。


20.C++的string的c_str()只读,可以使用sprintf("%s",str.c_str());但不可以使用scanf("%s",str.c_str());。


21.C++中有一种“字符串流”,可以实现类似sscanf和sprintf的功能。  先记一下...


22.数组和字符串往往意味着大数据量,而处理大数据量时会遇到“访问非法内存”的错误,C语言的操作数据前检查下标是否合法来缓解,但程序比较累赘...可以把数组开打一点点,正如13所说到的一样。


23.数组大小可以用sizeof在编译时可获得(它不是一个函数),它经常被用在memset、memcpy等函数中。


24.在使用c语言的字符串时,一定要保证它以"\0"结尾,不然有些函数会有缓冲区溢出的问题。


25.对于自增自减,建议在整一个表达式中,被影响的变量在整个表达式中最多出现一次。还记得国内很多C语言语法考试的特别喜欢考一个表达式有许多个对同一变量自增的题目,汗,见到我就不想做了...不知道出这些题目的人到底在想什么了....趁机吐槽一下。。。0.0


26.C语言中的struct 和typedef组合使用来定义一个新类名。具体语法:

typedef struct{ double x, y; } Point; //typedef struct { 域定义 } Point;


27.ACM是算法比赛,注重的是算法,使用C语言的时候,千万不要滥用指针,这不仅会把自己搞糊涂,还会让程序产生各种奇怪的错误。


28.对于for(int i; i < n; i++) 的语法,ANSI C 不支持(不过新标准已经支持这个语法细节了),建议保持为cpp后缀名。


29.关于超时:超时不见得是因为程序效率太低,也可能是其他原因造成的。例如:比赛规定程序应从文件读入数据,但你的程序却正在等待键盘输入。其他原因包括:特殊数据导致程序进入死循环、程序实际上已经崩溃却没有异常退出等。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值