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是屬於同一類...