关于本题0.0001的疑问
查看原帖
关于本题0.0001的疑问
179601
Win_dreamer楼主2025/8/1 12:17

RT本帖主要围绕题干中所述的0.0001提出疑问

本人的代码通过比较时间来判断是否可以接到球,逻辑应该没有问题。

但是不考虑0.0001的代码 #2WA

#include<iostream>
#include<cmath>
using namespace std;
double h,s,v,l,k;
int n,sum; 
int main(){
	cin>>h>>s>>v>>l>>k>>n;
	double t1=sqrt(0.2*(h-k)),t2=sqrt(0.2*h);
	while(n--){
		double tt1=(s-n)/v,tt2=(s+l-n)/v;
		if(tt1<=t2&&tt2>=t1) sum++;
	}
	cout<<sum;
	return 0;
}

而考虑了0.0001的代码 #3WA

主要是原因是读到0而答案是1,意思是说我少算了1个?但是加上这个精度不是理应比不加多一些吗?

#include<iostream>
#include<cmath>
using namespace std;
double h,s,v,l,k;
int n,sum; 
int main(){
	cin>>h>>s>>v>>l>>k>>n;
	k+=1e-3,s-=1e-3,l+=2e-3;
	double t1=sqrt(0.2*(h-k)),t2=sqrt(0.2*h);
	while(n--){
		double tt1=(s-n)/v,tt2=(s+l-n)/v;
		if(tt1<=t2&&tt2>=t1) sum++;
	}
	cout<<sum;
	return 0;
}

盘逻辑盘了好久感觉不会有问题,然后我尝试着只在宽度上考虑0.0001,而在高度上不考虑,最后莫名其妙AC了

按道理而言这不应该比上一种情况可能少算一个吗,最后为什么 #3 反而从0变成1了呢?

#include<iostream>
#include<cmath>
using namespace std;
double h,s,v,l,k;
int n,sum; 
int main(){
	cin>>h>>s>>v>>l>>k>>n;
	s-=1e-3,l+=2e-3;
	double t1=sqrt(0.2*(h-k)),t2=sqrt(0.2*h);
	while(n--){
		double tt1=(s-n)/v,tt2=(s+l-n)/v;
		if(tt1<=t2&&tt2>=t1) sum++;
	}
	cout<<sum;
	return 0;
}

这题真刷的我有点懵,不太能理解发生这种情况的原因,能否有大佬求解,或者说我的思路逻辑本身有问题,误打误撞才AC的话也请指正谢谢!

2025/8/1 12:17
加载中...