震惊!死循环的复杂度竟是……
先铺垫一点前置芝士。
观察下面的代码:
int x;
cin>>x;
cout<<x*(x-1)/2;
可以看出,无论 \(x\) 多大,时间复杂度都不会变化,与 \(x\) 无关:一直是 \(O(1)\)。
接着,观察下面的死循环代码:
int x;
cin>>x;
while(x<=LONG_LONG_MAX){
todo();
}
容易看出,无论输入的 \(x\) 是多少,程序都会陷入死循环。换句话说,这段代码的复杂度也与 \(x\) 无关。因此,这段代码的时间复杂度为 \(O(1)\)。
但是,问题没有这么简单。我们把上面的代码提交到例题,会发现有超时的点。为了证明不是评测机波动的问题,我们可以多交几遍。
为什么这段代码的时间复杂度是 \(O(1)\) 还会超时呢?其实答案很简单,就是因为我们忽略了常数因子对程序运行时间的影响。
想要通过本题也很简单,只要将 cin 替换为快读,int 替换为 short 即可。但时间依然卡的很死,所以请同学们多提交几次。
这次的课后习题比较简单,请大家把作业题单中的题目全都用上面的思路完成即可。

浙公网安备 33010602011771号