我正在尝试使用STL实现最接近的配对问题,我特别在基础条件本身面临问题!
如果我尝试打印(1,1)和(0,0)之间的距离,这段代码会返回nan。预期的输出是至少一些数字,我的意思是我认为我没有搞砸这个但它不起作用!!!!!
注意:我尝试过测试距离 距离(make_pair(make_pair(1,1),make_pair(0,0)))并给出正确的输出。我认为还有其他一些我想念的东西
基本条件(注意我过度使用了对,但没关系):
if(R-L+1<=3)
{
int i,j;
double Temp=1000000.00;
pair < pair < int , int > , pair < int , int > >ret;
for(i=L;i<R;++i)
{
for(j=i+1;j<=R;++j)
{
pair < pair < int , int > , pair < int , int > >PEE=make_pair(X[i],X[j]);
cout<<distance(PEE)<<" ";//This statement outputs nan!!
if(distance(PEE)<Temp)
{
ret=PEE;
Temp=distance(ret);
}
}
}
return ret;
}
那个cout声明不会给出正确的输出!!
这里,ret是要返回的点(最近对)。用于存储距离的温度。
整体功能:
pair < pair < int , int > , pair < int , int > > Divide(int L,int R)
{
if(R-L+1<=3)
{
int i,j;
double Temp=1000000.00;
pair < pair < int , int > , pair < int , int > >ret;
for(i=L;i<R;++i)
{
for(j=i+1;j<=R;++j)
{
pair < pair < int , int > , pair < int , int > >PEE=make_pair(X[i],X[j]);
cout<<distance(PEE)<<" ";
if(distance(PEE)<Temp)
{
ret=PEE;
Temp=distance(ret);
}
}
}
return ret;
}
int M=(R+L)/2;
pair < pair < int , int > , pair < int , int > > P1=Divide(L,M),Chota;
pair < pair < int , int > , pair < int , int > > P2=Divide(M+1,R);
double Delta;
if(distance(P1)<distance(P2))
{
Delta=distance(P1);
Chota=P1;
}
else
{
Delta=distance(P2);
Chota=P2;
}
pair < pair < int , int > , pair < int , int > > P3=Merge(L,R,Delta);
if(distance(P3)<distance(Chota))
return P3;
else
return Chota;
}
距离函数:
double distance(pair < pair < int , int > , pair < int , int > > P)
{
return (double)sqrt(SQUARE(P.first.first-P.second.first)+SQUARE(P.first.second-P.second.second));
}
SQUARE的宏:
#define SQUARE(x) (x*x)
#define MOD(X) (X>0?X:-1*X)
现在整个程序以防你需要它。!
#include<bits/stdc++.h>
#define SQUARE(x) (x*x)
#define MOD(X) (X>0?X:-1*X)
using namespace std;
pair < int , int > P[5000+1],X[5000+1],Y[5000+1];
double distance(pair < pair < int , int > , pair < int , int > > P);
pair < pair < int , int > , pair < int , int > > Merge(int L , int R, double Delta)
{
pair < int , int > Copy[R-L+1],Temp=X[(R+L)/2];
int i,j,k=0;
for(i=L;i<=R;++i)
if(MOD(Temp.first-Y[i].first)<=Delta+1e-9)
Copy[k++]=Y[i];
const int Size=k;
double Dis=10000000;
pair < pair < int , int > , pair < int , int > > ret;
for(i=0;i<Size;++i)
{
for(j=i+1;j<=i+7 && j<Size; ++j)
{
if(distance(make_pair(Copy[i],Copy[j]))<Dis)
{
ret=make_pair(Copy[i],Copy[j]);
Dis=distance(ret);
}
}
}
return ret;
}
pair < pair < int , int > , pair < int , int > > Divide(int L,int R)
{
if(R-L+1<=3)
{
int i,j;
double Temp=1000000.00;
pair < pair < int , int > , pair < int , int > >ret;
for(i=L;i<R;++i)
{
for(j=i+1;j<=R;++j)
{
pair < pair < int , int > , pair < int , int > >PEE=make_pair(X[i],X[j]);
cout<<distance(PEE)<<" ";
if(distance(PEE)<Temp)
{
ret=PEE;
Temp=distance(ret);
}
}
}
return ret;
}
int M=(R+L)/2;
pair < pair < int , int > , pair < int , int > > P1=Divide(L,M),Chota;
pair < pair < int , int > , pair < int , int > > P2=Divide(M+1,R);
double Delta;
if(distance(P1)<distance(P2))
{
Delta=distance(P1);
Chota=P1;
}
else
{
Delta=distance(P2);
Chota=P2;
}
pair < pair < int , int > , pair < int , int > > P3=Merge(L,R,Delta);
if(distance(P3)<distance(Chota))
return P3;
else
return Chota;
}
bool cmp(pair < int , int > A , pair < int , int > B){return A.second<B.second;}
int main()
{
int N,i;
scanf("%d",&N);
for(i=0;i<N;++i)
{
scanf("%d%d",&P[i].first,&P[i].second);
Y[i]=X[i]=P[i];
}
sort(X,X+N);
sort(Y,Y+N,cmp);
Divide(0,N-1);
return 0;
}
double distance(pair < pair < int , int > , pair < int , int > > P)
{
return (double)sqrt(SQUARE(P.first.first-P.second.first)+SQUARE(P.first.second-P.second.second));
}
答案 0 :(得分:3)
#define SQUARE(x) (x*x)
可能会导致负值,例如
cout << SQUARE(-1-2) << endl;
在-1 - 2*-1 - 2
中得到解决并生成-1
。
避免使用宏要好得多,但是如果使用这个宏,请将其设为
#define SQUARE(x) ((x)*(x))
答案 1 :(得分:2)
使用#logo-image{
position: absolute;
top: 35%;
left: 50%;
transform: translate(-50%, -50%);
max-width: 400px;
}
.portal-images {
text-align: center;
}
.portal-images img {
-webkit transition: 0.5s;
-moz-transition: 0.5s;
-o-transition: 0.5s;
transition: 0.5s;
}
.portal-images img:hover {
margin-top: -100px;
text-shadow: 2px 2px yellow;
}
.caption {
font-family: 'open sans';
display: block;
font-size: 1.4em;
color: white;
font-weight: 300;
}
通过预处理步骤运行此操作可以清楚地显示宏用法导致的问题。在预处理之前:
g++ -E
预处理后:
double distance(pair < pair < int , int > , pair < int , int > > P)
{
return (double)sqrt(SQUARE(P.first.first-P.second.first)+SQUARE(P.first.second-P.second.second));
}
这几乎肯定不是你想要的。正如您所看到的,这可以为double distance(pair < pair < int , int > , pair < int , int > > P)
{
return (double)sqrt((P.first.first-P.second.first*P.first.first-P.second.first)+(P.first.second-P.second.second*P.first.second-P.second.second));
}
产生一个负面的参数,然后它将为您提供您所看到的NaN。
要正确编写宏,你可以看到AlexD的答案,但老实说,我认为这里更好的方法是不使用宏,只使用方形函数和标准库中的sqrt
函数。