简单三分的做法,一般判断距离问题考虑三分算法.
此题为何三分:可以将此题近似为从无穷小和无穷大到原地聚集则两边的无穷往中间走的过程是减小,所以可能是单峰函数
一般情况下可以先在草稿本上画一画试一试看看三分可不可以算出正确答案
#include<bits/stdc++.h> #define INF 0x3f3f3f3f #define DOF 0x7f7f7f7f #define mem(a,b) memset(a,b,sizeof(a)) typedef long long ll; using namespace std; const int maxn=1e5+10; const double eps=1e-7; int n; struct node{ double x,y; }node[maxn]; double calc(double x) { double maxx=0,dis; for(int i=0;i<n;++i){ dis=(node[i].x-x)*(node[i].x-x)+node[i].y*node[i].y; maxx=max(maxx,dis); } return maxx; } int main() { scanf("%d",&n); for(int i=0;i<n;++i) scanf("%lf%lf",&node[i].x,&node[i].y); double lmid,rmid,lmidf,rmidf,l=-10000,r=10000;//三分模板变量 double ans=DOF; while(r-l>eps){ lmid=l+(r-l)/3.0;rmid=r-(r-l)/3.0; lmidf=calc(lmid);rmidf=calc(rmid);//转换式 ans=min(ans,min(lmidf,rmidf)); if(lmidf<rmidf) r=rmid-eps; else l=lmid+eps; } printf("%d ",(int)sqrt(ans)); }
三分整数模板
while(l<=r){ lmid=l+(r-l)/3;rmid=r-(r-l)/3; lmidf=f(lmid); rmidf=f(rmid); ans=min(ans,min(lmidf,rmidf)); if(lmidf<rmidf){ r=rmid-1; }else l=lmid+1; }