```
#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