hdu 3007【爬山演算法】
阿新 • • 發佈:2018-11-04
題意:還是和別的一樣是個模板提,給出n個點的座標,然後求出一個點到這個點的最短距離的座標,並輸出最短距離
這個資料很水,精度要求也沒有這麼高
//#include<bits/stdc++.h> #include <iostream> #include <cmath> #include <cstdio> #include <stdlib.h> #include <ctime> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; const int maxn = 1e4 + 5; int n; double X,Y; //求到n個點的最大距離最小化的點 struct point { double x,y; } p[maxn],pp; double ans=1e10; double dis(point a,point b) { return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int get(point x) { double res=-1; int k; for(int i=1; i<=n; ++i) { double m=dis(p[i],x); if(m>res) res=m,k=i; } ans=min(ans,dis(x,p[k])); return k; } void hc() { int cnt=0; double T=1,eps=1e-5; while(T>eps) { int k=get(pp); pp.x=pp.x+(p[k].x-pp.x)*T; pp.y=pp.y+(p[k].y-pp.y)*T; //pp.z=pp.z+(p[k].z-pp.z)*T; T*=0.96; cnt++; } //cout<<cnt<<endl; } int main() { double X,Y; while(scanf("%d",&n)!=EOF) { if(n==0)break; pp.x=pp.y; for(int i=1; i<=n; ++i) { cin>>p[i].x>>p[i].y; pp.x+=p[i].x,pp.y+=p[i].y; } pp.x/=n;pp.y/=n; ans=1e10; hc(); printf("%.2f %.2f ",pp.x,pp.y); printf("%.2f\n",sqrt(ans)); } return 0; } /* */