C++ Convention Note

 

打印%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的笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值