凌幽 @ 2018-01-28 20:54:36
虽然我知道这道题的正解是分治算法,但是我想问一下,下面这种想法在什么情况下是错误的呢?
有疑问的想法: 将所有点以左端点为第一关键字从小到大,以右端点为第二关键字从小到大排序
穷举时,先固定一个点,枚举另一个点,若两点之间距离大于当前已知的最小距离就break掉
嗯,防止误会我的意思,我还是贴一下代码吧,不过这种做法居然能过9组,惊讶Σ(⊙▽⊙"a
int N;
ld Minn=1e12;
struct pot {
int x,y;
bool operator < (const pot &t) const{
if(x!=t.x) return x<t.x;
return y<t.y;
}
}A[200005];
int main(){
scanf("%d",&N);
for(R int i=1;i<=N;++i)
scanf("%d%d",&A[i].x,&A[i].y);
sort(A+1,A+1+N);
for(R int i=1;i<N;++i)
for(R int j=i+1;j<=N;++j){
R ld a=A[i].x-A[j].x,b=A[i].y-A[j].y;
R ld c=sqrt(a*a+b*b);
if(c<Minn) Minn=c;
else break;
}
printf("%.4lf\n",Minn);
return 0;
}
by Dog_Two @ 2018-01-28 20:58:19
不妨把数据溢出导致错误答案的可能性排除完毕再考虑算法的正确性哦
by 142857cs @ 2018-10-14 14:52:09
给你一组hack数据:
4
0 0
2 0
2 5
3 0
按你的思路应该会算出2,答案显然是1