为什么TLE?
encore
2018-11-14 21:20:44
超时(~~这不是废话吗~~
### 如果差的不是很多:
可以考虑卡常。主要有以下几种:
* 读优
又叫快读,这个已经烂大街了,本人刚学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];
```
快。
不过这个太玄学了,一般没什么用。
### 如果差很多:
去吧~优化复杂度~
这就是你算法本身的问题了。
** 检查是否有重复计算、无用计算 **
** 题目是否可以找规律、打表 **
~~卡常是救不了你的~~