为什么TLE?

encore

2018-11-14 21:20:44

Personal

超时(~~这不是废话吗~~ ### 如果差的不是很多: 可以考虑卡常。主要有以下几种: * 读优 又叫快读,这个已经烂大街了,本人刚学OI一周不到就会用getchar写读优了。能在读入数据时比scanf快20%左右,当然用fread更快。在此就不赘述了,有需要可以查看[这篇文章](https://www.luogu.org/blog/encore/io-you-hua-nei-suo-shi) 。 不要尝试用putchar写输出优化,会比scanf还慢。 * register 在局部变量前加一个,能快很多。注意别用太多,会有反作用的。 * inline 在函数前加一个,以代码膨胀为代价加快函数调用速度。 inline无视所有带递归的函数,也就是这样你加了没用。据说函数里while好像也不行。 * 指针 通常我们是这样读入数组的: ```cpp int a[1001]; for (register int i = 1;i <= n;++ i) { scanf("%d",&a[i]); } ``` 然而这样更快: ```cpp int a[1001]; register int *e = a + n; for (register int *i = a + 1;i <= e;++ i) { scanf("%d",i); } ``` 原理是方括号需要做一次加法运算。 顺带一提```i++```比```++i```慢很多。 * for 我们学校曾经有个毒瘤出题人卡for循环。 for循环跳层要时间。比如 ```cpp int sum = 0; int n=5,m=10000; for (int i = 1;i <= n;++ i) for (int j = 1;j <= m;++ j) sum += a[i][j]; ``` 应该比 ```cpp int sum = 0; int n=5,m=10000; for (int i = 1;i <= m;++ i) for (int j = 1;j <= n;++ j) sum += a[i][j]; ``` 快。 不过这个太玄学了,一般没什么用。 ### 如果差很多: 去吧~优化复杂度~ 这就是你算法本身的问题了。 ** 检查是否有重复计算、无用计算 ** ** 题目是否可以找规律、打表 ** ~~卡常是救不了你的~~