提醒以后的自己
有很多时候做题莫名其妙的RE,其实是程序有很多细节没有注意
Eg1 :Luogu P1542 包裹快递
这是一个代码片段
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>s[i];
maxx=max(maxx,(long double)1.00*(s[i]/(x[i]-y[i-1]<0?1:x[i]-y[i-1])));
}
50分,RE
可见有这样的语句
s[i]/(x[i]-y[i-1]<0?1:x[i]-y[i-1]
如果x[i]=y[i-1]的时候,除数会=0而引发RE
改为<=即可判掉除数为0的情况,而归到负数里面
即
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>s[i];
maxx=max(maxx,(long double)1.00*(s[i]/(x[i]-y[i-1]<=0?1:x[i]-y[i-1])));
}
AC
Eg2: Luogu P7076 动物园
观察题目数据范围,会发现有,,1<=c<=108
而代码中又有
long long ksm(long long a,long long b){
if(b==1) return a;
long long u=ksm(a,b/2);
return u*u*(b%2?a:1);
}
cout<<ksm(2,k-cnt+used)-n;
cnt和used都<=m
95分,WA
是因为有可能会出现计算264的情况,而这个数字是unsigned long long都无法承载的
所以标准做法应该全部使用Unsigned long long并特判264的情况输出字符串(高精也不是不行)
改为:
unsigned long long ksm(unsigned long long a,unsigned long long b){
if(b==1) return a;
unsigned long long u=ksm(a,b/2);
return u*u*(b%2?a:1);
}
if(k-cnt+used!=64) cout<<ksm(2,k-cnt+used)-n;
else cout<<"18446744073709551616"; //2^64=18446744073709551616
AC

浙公网安备 33010602011771号