解决this problem,我找到了
if(!(p<arr[i]))
和
if(p>=arr[i])
可能会有不同的结果(p
是long long
而arr[i]
是double
),因为第一个解决方案已被接受而第二个解决方案未被接受。为什么呢?
完整的上下文代码:
#include <bits/stdc++.h>
#define EPS (1e-5)
using namespace std;
typedef long long ll;
double arr[10005];
int main(){
ll D,p;
string s;
while(getline(cin,s)){
stringstream ss(s);
ss>>D>>p;
int n=0;
while(ss>>arr[n]) ++n;
ll dmin=D+1;
if(n<D+1){
double a=arr[n-4];
double b=arr[n-3];
double c=arr[n-2];
double d=arr[n-1];
double den=a*c-b*b;
double s=(c*c-b*d)/den;
double t=(a*d-b*c)/den;
for(int i=n;i<=D;++i)
arr[i]=s*arr[i-2]+t*arr[i-1];
}
for(int i=0;i<=D;++i){
if(!(p<arr[i]))
dmin=min(dmin,D-i);
else
break;
}
if(dmin==0) cout<<"The spider may fall!"<<endl;
else if(dmin==D+1) cout<<"The spider is going to fall!"<<endl;
else cout<<dmin<<endl;
}
}
答案 0 :(得分:1)
如果kafka_<scala_version>
和!(a<b)
不同,那么最可能的解释是其中一个是NaN。 涉及NaN的任何比较会产生(a>=b)
,因此如果false
是NaN,则b
和(a<b)
都将为false,并且{ {1}}将是真的。
首先看看你的代码:
(a>=b)
没有明显的理由说明!(a<b)
不能为零,在这种情况下,double den=a*c-b*b;
double s=(c*c-b*d)/den;
double t=(a*d-b*c)/den;
和den
都将是无穷大。然后,你计算:
s
如果t
和for(int i=n;i<=D;++i)
arr[i]=s*arr[i-2]+t*arr[i-1];
是最重要的,那么总和有足够的空间可以使s
成为NaN。相同符号的两个无穷大的总和是无穷大本身,但两个相反符号的无穷大的总和是NaN。此外,0和无穷大的乘积是NaN。
一旦NaN进入t
,它就会传播,因为每个元素都依赖于前一个元素。
因此,如果arr[i]
为0,您可能需要做一些事情。