【Codeforces Round #514 (Div. 2) D. Nature Reserve】 三分+推公式
題目鏈接
Codeforces Round #514 (Div. 2) D. Nature Reserve
題意
給你一些二維平面上的點(diǎn),找一個與x軸相切的半徑最小的圓包含所有點(diǎn)。
做法
首先如果兩邊都有點(diǎn)的情況一定是找不到這樣的圓的,否則一定可以找到這樣的圓首先如果兩邊都有點(diǎn)的情況一定是找不到這樣的圓的,否則一定可以找到這樣的圓首先如果兩邊都有點(diǎn)的情況一定是找不到這樣的圓的,否則一定可以找到這樣的圓
我們可以發(fā)現(xiàn)圓心橫坐標(biāo)一定越貼近中間越好,所以滿足三分的性質(zhì)我們可以發(fā)現(xiàn)圓心橫坐標(biāo)一定越貼近中間越好,所以滿足三分的性質(zhì)我們可以發(fā)現(xiàn)圓心橫坐標(biāo)一定越貼近中間越好,所以滿足三分的性質(zhì)
而且我們固定橫坐標(biāo)就可以算出半徑R而且我們固定橫坐標(biāo)就可以算出半徑R而且我們固定橫坐標(biāo)就可以算出半徑R
所以只要每次向需要半徑更小的范圍內(nèi)三分即可所以只要每次向需要半徑更小的范圍內(nèi)三分即可所以只要每次向需要半徑更小的范圍內(nèi)三分即可
計算半徑的方法如下計算半徑的方法如下計算半徑的方法如下
所以有(R?y1)2+(x?x1)2=R2所以有(R-y1)^2+(x-x1)^2=R^2所以有(R?y1)2+(x?x1)2=R2
R=(x?x1)2+y122×y1R=\frac{\left( x-x1 \right) ^2+y_{1}^{2}}{2\times y_{_1}}R=2×y1??(x?x1)2+y12??
代碼
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; #define dbg(x) cout<<#x<<" = "<<x<<endl const int maxn = 1e5+6; const double eps = 1e-10; int n; double x[maxn],y[maxn]; double solve(double xx) {double ans=0.0;for(int i=1;i<=n;i++){double tmp=(xx-x[i])*(xx-x[i])+1.0*y[i]*y[i];tmp=tmp/(2.0*y[i]);ans=max(ans,tmp);}return ans; } double trisection_search(double left, double right) {double midl,midr;while (right-left>1e-7){midl=(left+right)/2.0;midr=(midl+right)/2.0;if(solve(midl)<=solve(midr)) right=midr;else left=midl;}return solve(left); } int main() {scanf("%d",&n);int flag=0;for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);int sum[2]={0,0};for(int i=1;i<=n;i++){if(y[i]<0) sum[0]++;if(y[i]>0) sum[1]++;}if(sum[0]>0&&sum[1]>0){printf("-1\n");return 0;}for(int i=1;i<=n;i++) y[i]=abs(y[i]);printf("%.10f\n",trisection_search(-1e20,1e20));return 0; }總結(jié)
以上是生活随笔為你收集整理的【Codeforces Round #514 (Div. 2) D. Nature Reserve】 三分+推公式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ionic emulate实时调试修改
- 下一篇: excel怎么设置自动计算_61份电气自