C++ 比较器保证和内部工作

C++ comparator guarantees and inner workings

求解this problem,我发现

if(!(p<arr[i]))

if(p>=arr[i])

可能有不同的结果(plong longarr[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;
    }
}

如果 !(a<b)(a>=b) 不同,那么最可能的解释是其中一个是 NaN。 任何涉及 NaN 的 比较结果为 false,因此如果 b 是 NaN,则 (a<b)(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 不能为零没有明显的原因,在这种情况下 st 都将是无穷大。然后,你计算:

for(int i=n;i<=D;++i)
  arr[i]=s*arr[i-2]+t*arr[i-1];

如果 st 是无穷大,那么产生 arr[i] 的和有足够的空间成为 NaN。两个同号无穷大之和就是无穷大本身,而两个异号无穷大之和就是 NaN。另外,0 和无穷大的乘积是 NaN。

一旦 NaN 进入 arr,它就会传播,因为每个元素都依赖于前一个元素。

因此,如果 den 为 0,您可能需要做一些事情。