~i与i>=0有什么不同
敲代码的时候
for循环的条件写的是~i,结果超出时间限制了
但只要改为i>=0就可以过掉题目
所以两者有什么不同吗?_?
(原问题贴*2,感谢提供回答及思路的善良大佬们~)
for(int i = n; i >= 0; --i) { ;}
for(int i = n; ~i; --i) { ;}
可以看到
无论是第一个还是第二个循环当中,当i=-1时,循环跳出
两个循环功能相同
(下方只是举个例子,如果不了解,并不影响什么)
在链式前向星中,如果将head数组初始化为-1,会经常使用上面两个循环
也同样在敲题的时候,发现
写i>=0的代码可以规避掉写~i的代码的TLE问题
(关于怎么debug出来的,作者表示:呜~它恶心啊)
那么,判断就是:
在常数大、数据范围大、算法正好卡在线上的时候
i>=0这种表达方法起了作用
下面是一些简单的实验
代码如下
因为整型下的一次循环花费时间略小,不方便使用
所以代码里敲的是两次或三次循环
#include<bits/stdc++.h>
#define ri register int
using namespace std;
int n=1000;//更大数据同理
signed main() {
printf("数据大小为:%d的三次方\n",n);
clock_t st,ed;
st=clock();
for(ri i=n; i>=0; --i)
for(ri j=n; j>=0; --j)
for(ri k=n; k>=0; --k);
ed=clock();
printf("大小比较表示所用时间:\n%lfs\n",(double)(ed-st)/CLOCKS_PER_SEC);
st=clock();
for(ri i=n; ~i; --i)
for(ri j=n; ~j; --j)
for(ri k=n; ~k; --k);
ed=clock();
printf("取反表示所用时间:\n%lfs\n",(double)(ed-st)/CLOCKS_PER_SEC);
return 0; }
发现,在大多数时候,相比于~i,i>=0这种代码形式会更快一些
然而也有不一样的例外,比如下图
在这种例外发生的时候,发现再次编译后输出时间发生了变化
有t1>t2的时候,也有t1<t2的时候
介于随机性很大,而且类似的数据范围在打题的时候TLE的可能性大,
所以不作考虑
所以
在时间限制内,直接的大小比较更好一些
~