當前位置:
首頁 >
POJ-2069 Super Star(最小球覆盖)
發布時間:2023/12/3
48
豆豆
生活随笔
收集整理的這篇文章主要介紹了
POJ-2069 Super Star(最小球覆盖)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
POJ-2069 Super Star
題意:
給你n個點,求覆蓋所有點的最小球的半徑
4<=n<=30
題解:
求最小球覆蓋的步驟:
(1)對于一個點:球心就是這個點,且半徑無窮小。 (2)對于兩個點:球心就是兩點線段的中點,半徑就是線段長度的一半。
(3)對于三個點:三點構成的平面必為球的大圓,球心是三角形的外心,半徑就是球心到某個點的距離。
(4)對于四個點:若四點共面,則轉換到3點共面;若四點不共面,四面體可以唯一確定一個外接球。
(5)對于五個及以上的點:最小球必為某四個點的外接球。
由此不難推導出最小球覆蓋的球心一定與他距離最遠的點有且最多有4個等距離的點。那么我們可以先假設一個點為球心,找到與他距離最遠的點,并移動球心靠近該點,不斷重復此過程,就能找到最小球覆蓋的球心了。
代碼:
#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b); using namespace std; typedef long long ll; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll=1e18; const int INF_int=0x3f3f3f3f; inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //計時開始freopen("in.txt","r",stdin);#endif } void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //計時結束printf("\n運行時間為:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif } struct point3{double x,y,z; }point[40]; double dis(point3 a,point3 b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); } int n; const double eps=1e-6; double solve(){double step=100,ans=1e10,mt;point3 c;c.x=c.y=c.z=0;int s=0;while(step>eps){for(int i=1;i<=n;i++)if(dis(c,point[s])<dis(c,point[i]))s=i;//距離c最遠的點sdouble Dis=dis(c,point[s]);// c與s的距離,相當于半徑 c.x+=(point[s].x-c.x)/Dis*step;c.y+=(point[s].y-c.y)/Dis*step;c.z+=(point[s].z-c.z)/Dis*step;ans=min(ans,Dis);step*=0.98;}return ans; } int main() {rd_test();double ans;while(cin>>n&&n){for(int i=1;i<=n;i++){cin>>point[i].x>>point[i].y>>point[i].z;}ans=solve();printf("%.5f\n",ans);}return 0;//Time_test(); }總結
以上是生活随笔為你收集整理的POJ-2069 Super Star(最小球覆盖)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 眼睛换人工晶体的副作用有哪些
- 下一篇: OR(牛客第八场)