打印%d
printf("%%d");
几个重要的值
int max = 2^31 - 1 = 2147483647
int min = 2^31 = 2147483648 (表示方法为2^32 - n)
使用int时最大的平方数:46340; 46341^2 超出int的范围
赋值小技巧
tot = a[x=0][y=n-1] = 1;
// 这条语句相当于赋值了四个数:tot、a[0][n-1]、x、y
四舍五入
floor(x+0.5)
浮点误差
浮点计算存在误差,比较两个浮点数要考虑浮点误差。
Mod 小技巧
计算只有+,-,* 这三个operation后除以int的余数,可以每步计算后取mod,结果不变。
Max Min 小技巧
变量未赋值前不确定,它不一定 = 0;
所以当处理有关Max Min的题时,可以定义
max = min = x1
输出空行 小技巧
在输出的每个case之间,比赛可能要求插入空行。
一般我们会这么写:
LOOP{
printf("Result\n");
printf("\n");
//假设这个程序复杂度为 O(n)
}
但输出的结尾应为回车,而不会有多一个空行,所以我们可以这么写:
kase = 0
LOOP{
if(kase) printf("\n");
printf("Result\n",++kase);
//现在这个程序复杂度为 O(n+2); 多了一个if和一个++,但 +const 不会影响整体复杂度
//所以现在这个程序复杂度仍为 O(n);
}
嵌套中的同名变量
当嵌套的两个代码块中有同名变量时,内层变量会屏蔽外层变量。
—— 《算法竞赛入门经典(第二版)》
递增存在的问题
count = count++
printf("%d%d%d",count++,count++,count++)
上述两个语句存在一定问题,不同编译方式例如clang和gcc可能会导致不同的结果。可以参考雾花小路的答案。
防止中间结果溢出
组合数定义及计算公式如下图
为避免中间结果溢出,采用约分的方法,利用n!/m!=(m+1)(m+2)…(n-1)n
同时运用小技巧:当m小于n-m时,令m=n-m;这时,运算中m于n-m互换。
long long C(int n,int m){
if (m<n-m) m=n-m;
long long ans=1;
for (int i=m+1;i<=n;i++)
ans*=i;
for (int i=1;i<=n-m;i++)
ans/=i;
return ans;
-----此处参考still_till的笔记