为什么#7不一样

P2006 赵神牛的游戏

``` #include <bits/stdc++.h> using namespace std; int a[100000]; int main() { int k,m,x,flag=0,a,b; cin>>k>>m>>x; for(int i=1;i<=m;i++) { cin>>a>>b; if(a==0) { cout<<i<<" "; flag=1; } else { int c=k/a; if(c*b>=x) { cout<<i<<" "; flag=1; } } } if(flag==0) cout<<-1; return 0; } ``` 参考一下
by x1489631649 @ 2023-08-05 11:58:24


@[x1489631649](/user/780505) 我知道正确代码,我只是想知道这两个测试点为什么一个RE,一个WA
by suyihang @ 2023-08-05 12:54:42


@[suyihang](/user/711031) 额,小生学艺不精,还请另找高人![](//图.tk/6)
by x1489631649 @ 2023-08-05 13:05:53


@[x1489631649](/user/780505) 我也是小学生
by suyihang @ 2023-08-05 13:07:28


@[suyihang](/user/711031) 额我刚离开xxs系列![](//图.tk/4)
by x1489631649 @ 2023-08-05 13:08:07


但是我查阅了资料,详见https://www.luogu.com.cn/problem/P8815(题目里的资料是真的)
by suyihang @ 2023-08-05 13:08:55


@[suyihang](/user/711031) 原因很简单: 第一份代码是首先做除法再判断除数是否为 $0$,如果 $a_i$ 为 $0$ `k/a[i]` 会直接 RE,后面的判断不会执行; 第二份代码则是先判断除数是否为 $0$,再做除法,所以不会 RE,因为当判断除数是否为 $0$ 的时候,除数确实为 $0$,所以 `||` 直接短路,后面的除法根本不会执行,也就不会 RE。 真实案例:有一次我写 [[CSP-J 2022] 上升点列](https://www.luogu.com.cn/problem/P8816) 时: 不加任何判断 15 分(大红大紫,[评测记录](https://www.luogu.com.cn/record/130544791)); 在最后面加了判断 75 分(只有 RE,[评测记录](https://www.luogu.com.cn/record/130545035)); 结果把判断放到前面来就 AC 了(什么鬼数据,[评测记录](https://www.luogu.com.cn/record/128027780))。 所以说,防止 RE 的判断一定要放在最前面,或者说,先放一定不会 RE 的,再放一旦执行到就不会 RE 的!
by hhce2012 @ 2023-10-20 13:53:47


|