RT本帖主要围绕题干中所述的0.0001提出疑问
本人的代码通过比较时间来判断是否可以接到球,逻辑应该没有问题。
但是不考虑0.0001的代码 #2 会 WA
#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的代码 #3 会 WA
主要是原因是读到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的话也请指正谢谢!