震惊!死循环的复杂度竟是……

先铺垫一点前置芝士。

观察下面的代码:

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 即可。但时间依然卡的很死,所以请同学们多提交几次。

这次的课后习题比较简单,请大家把作业题单中的题目全都用上面的思路完成即可。

posted @ 2026-08-30 12:48  CrossBow_EXE  阅读(2)  评论(0)    收藏  举报
d125ec3a-002b-4467-d68f-08dbc3e79a09