提醒以后的自己

有很多时候做题莫名其妙的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

posted @ 2022-07-24 14:42  Cap1taL  阅读(24)  评论(0)    收藏  举报