tyvj 1081 最近距離 平面最近點對

2021-05-25 00:15:01 字數 1620 閱讀 9506

from admin

☆最近距離

輸入格式 input format

第一行n

下面n行,x,y

輸出格式 output format

最近的兩個點

樣例輸入 sample input [複製資料]

樣例輸出 sample output [複製資料]

時間限制 time limitation

各個測試點1s

#include

#include

#include

#include

#include

using namespace std;

const int maxn=200000;

const int inf=(1<<30);

struct point

double x,y;//座標

int id;//標號

int n;//點數

point a[maxn];

int cx,cy;//最近點對

double cmin;

double dis(point h,point k)

return sqrt((h.x-k.x)*(h.x-k.x)+(h.y-k.y)*(h.y-k.y));

bool cmp(point h,point k)

if(h.x!=k.x) return h.xreturn h.yint y[maxn],len;

bool cmp2(int i,int j)

return a[i].yvoid solve(int l,int r)

if(l==r) return ;

if(l==r-1)

double tmp=dis(a[l],a[r]);

if(tmpif(l==r-2)

double l1=dis(a[l],a[l+1]);

double l2=dis(a[l+1],a[l+2]);

double l3=dis(a[l],a[l+2]);

if(l1if(l1if(l2if(l2if(l3int mid=(l+r)>>1;

solve(l,mid);solve(mid+1,r);

len=0;

for(int i=l;i<=r;i++)

if(fabs(a[i].x-a[mid].x)y[len++]=i;

sort(y,y+len,cmp2);

for(int i=0;ifor(int j=i+1,cnt=1;jdouble tmp=dis(a[y[i]],a[y[j]]);

if(tmpcmin=tmp,cx=a[y[i]].id,cy=a[y[j]].id;

int main()

while(scanf("%d",&n)==1)

cmin=inf;

for(int i=0;iscanf("%lf%lf",&a[i].x,&a[i].y);

a[i].id=i+1;

sort(a,a+n,cmp);

solve(0,n-1);

printf("%d %d/n",min(cx,cy),max(cx,cy));

//printf("%.3lf/n",cmin);

return 0;

TYVJ 1081 最近距離 解題報告

怎麼講。純水題吧,隨便搜一下就可以了。不過搜法也有很多,我第一次寫的是直接求距離,因為要開平方,又是o n 2 的複雜度,所以沒超時。但是最後乙個資料293ms,有點危險,看了下題解,有好方法,直接使用x 2 y 2,不開平方,畢竟就是比較距離嘛!寫出來的那個 全部wa了,不知道怎麼回事,好睏了,明...

單詞最近距離

有一篇文章內含多個單詞,現給定兩個單詞,請設計乙個高效演算法,找出文中這兩個單詞的最短距離 即最少相隔的單詞數,也就是兩個單詞在文章中位置的差的絕對值 給定乙個string陣列article,代表所給文章,同時給定文章的單詞數n和待查詢的兩個單詞x和y。請返回兩個單詞的最短距離。保證兩個單詞均在文中...

t010 最近距離

time limit 1 second memory limit 32 mb 聚類方法要求將空間中的點集,按照一點的方式進行歸類,要求每一類中的點集相互之間的距離足夠的 近 聚類的一般方法是選取某乙個點p,並用乙個距離r作為度量,只要空間中的點q距離點p的距離不超過r時,我們說點q和點p是屬於同一類...