acm总结
注意事项:
-
不要轻易中途变换思路修改代码
-
发现有样例无法通过可以用if强行通过
-
注意输入输出形式(long long为lld,无符号为llu)。
-
开过1亿的int型数组
-
Long long能读入输出19位数
-
调用函数时是否有放入参数
-
调用函数的参数是否在合理范围内(米勒素数的参数应从2开始)
-
不要在子函数重复定义全局变量(tarjan中cnt重复定义)
-
注意判断与循环的小括号后有没有多加;号
-
当输入数据量特别小并且输入字符的时候很容易出现不合法数据,所以这时候最好不要用scanf要用cin更加安全
-
Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣。Prim+Heap在任何时候都有令人满意的的时间复杂度,但是代价是空间消耗极大。【以及代码很复杂>_<】时间复杂度并不能反映出一个算法的实际优劣。
-
竞赛所给的题大多数是稀疏图,所以尽可能地使用Prim+Heap吧,在稀疏图中这是无敌的。如果一定要在朴素Prim和Kruskal里选一个的话那就用Kruskal吧。当然Prim的代码比较简单,对付水题用Prim也无所谓,只要不是极稀疏图两者相差不大
-
勿把find(i)写成find(0)
-
不能在printf中使用%lf。printf()用%f输出double型,而scanf用%lf
-
注意在同一个模块多个循环的循环变量混用
-
要排序的数组范围
-
写博客标注题目出处,注释变量名,题目意思
-
用gets注意是否有读入其他地方的回车,要学会运用printf调试
-
读字符串不要用gets,用getline可读入一行内容
-
#include<bits/stdc++.h>包含了目前c++所包含的所有头文件
-
C程序默认log()是取自然对数为底,即ln.直接用换底公式表示其他数为底的log,写个简单的表达式就完成了。例如:log2 x写成:log(x)/log(2).exp就是计算e的多少次方
-
在C++下,若要使用C中已有库中的函数如stdio,文件包含方式为前面加一个c,同时去掉.h后缀,如#include <cstdio>,同时必须加上using namaspace;对于其他类似的函数同样;
-
对于C++特有的库,直接用去掉.h后缀的文件包含,并加上using namaspace;
-
#include<bits/stdc++.h>这个头文件包含以下等等C++中包含的所有头文件,不过在国内oj中,poj,hdu 不支持这个函数,这几个oj的编译器问题,其他国外的oj,还有台湾的oj都支持,CF,Topcoder也都支持
-
scanf("%lf %c %lf",&a,&chh,&b);数据输入时,最好严格按照样例留有空格
-
position=max_element(a,a+n)-a;这样写的话就代表的是找到的最大元素的位置在哪里,position代表位置, 值得注意的一点是这个返回的是最大元素的位置,即指针指向第一个最大元素我们用以下方式表示找到的最大元素的值 printf("%d\n",*max_element(a,a+n)); 同时 min_element的用法同上,但是都有一个共同点,就是找到的位置都是第一个最大(小)的元素,即存在多个相同大小的元素的时候找到的是第一个
-
long long的使用:输入:scanf("%I64d",&l);输出:printf("%I64d",s);为了以后避免错误,就直接用这种方式就行了
- 打素数表用欧拉筛数法,不要用米勒素数,容易溢出
- 读入整行字符串:
char str[1024]; scanf("%[^\n]",&str); getchar(); //此时读入的字符串是可以含有空格,而且会把开头的空格也读进来,如果要循环多次从屏幕上读取一行的话,就要在读取一行后,在用%c读取一个字符,将输入缓冲区中的换行符给读出来
-
strchr函数的用法:
原型: char *strchr(const char *s,char c);
#include<string.h>
查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针,如果s中不存在c则返回NULL。
- run time error: 数组越界,编译器选择错误
- 设有一串数,0<a....b.....c,b到c的异或和=a到c的异或和 异或 a到b的异或和,(因为异或满足结合律,交换律,(a^..^c)^(a^...^b)=a^a^...^b^b^...c=b'^...^c)
- strstr(p, p1) 查找子字符串
- 若调用函数对象为a++,则为先调用a,再自加
- 递归调用的边界部分不能漏掉return!
- 有些题目的输出中末尾不能有空格!例如HDU1016
- stl队列没有迭代器
- 广搜时要注意设置标记数组,给每一步做标记 ,数据合法性的判断是否完全
- 解题时,可以先用超时的方法进行打表,再解题
- 给字符数组加结束符号要用双引号:char s[5]="\0";
- debug想输出队列时,可以用另一个队列来装
- 不要用与库函数同名的名字来命名函数,如div
- 可以用printf调试法来看懂他人代码
- 提交前最好不要有warning信息
- int二维数组可以开到10000*10000,如果二位数组无法装下,则考虑用vector
- 快速幂用long long以防溢出
-
若出现错误:fatal error: iostream: No such file or director,则可能是提交的编译环境选择错误
- sort(a,a+n);的排序范围是a[0]~a[n-1]
- 提交前记得注释掉测试代码段
- 程序异常终止,要检查函数参数是否有不合格情况
- 遇事不决先打表,首先暴力打个表,多打表找规律
- 对题目理解有疑问要懂得问客服,多查看问答区域
- 使用long long 时,记得用%lld
- 若提交后显示无此头文件,则检查提交时的编译环境是否选择正确
- 输出要注意题目要求的小数位数
-
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
- cstring与string不一样,要分别添加
- 开数组时,注意看清题目限制。如n x m<...
- 涉及图形的题目时,在找规律时要认真画图
- 不要再case里面定义变量
- 当题目要求答案对1e9取模时,用long long
- WA时先检查输出格式是否正确
- for()循环中的判断条件应尽量少
- stringstream在进行多次类型转换前,必须先运行clear()
知识点:
-
快速幂
-
米勒素数:
1
随机取一个
a
2 如果
它不满足 a^(n-1)%n
==1
3 则它一定是
合数
4 退出
5 如果它满足
a^(n-1)%n
==1
6 则它是一个素数的概率是1/2
7 回到
1
if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11
-
快速幂模:(a*b)%c=(a%c)*(b%c)%c
-
(a+b) mod p = (a mod p + b mod p) mod p
(a*b) mod p = ((a mod p) * (b mod p)) mod p
(a-b) mod p = ((a mod p)-(b mod p) + p) mod p