bzoj2823[AHOI2012]信号塔
2015-12-05 11:28
295 查看
随机增量法求最小覆盖圆,主要就是圆心坐标神烦,后来看到了ACdreamer的一个简洁版本,虽然还没明白是为什么但是比窝那个短多了
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#define LL long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
#define N 1000005
#define eps 1e-8
struct P
{
double x,y;
}d
;
int n;
double dis(P a,P b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
P get(P A,P B,P C)
{
P t;
double a1=B.x-A.x,b1=B.y-A.y,c1=(a1*a1+b1*b1)/2;
double a2=C.x-A.x,b2=C.y-A.y,c2=(a2*a2+b2*b2)/2;
double d=a1*b2-a2*b1;
t.x=A.x+(c1*b2-c2*b1)/d;
t.y=A.y+(a1*c2-a2*c1)/d;
return t;
}
P get(P a,P b)
{
return (P){(a.x+b.x)/2,(a.y+b.y)/2};
}
int main()
{
scanf("%d",&n);
fo(i,1,n) scanf("%lf%lf",&d[i].x,&d[i].y);
P t=d[1];double r=0.0;
fo(i,1,n)
{
if (dis(d[i],t)<=r+eps) continue;
t=d[i];r=0;
fo(j,1,i-1)
{
if (dis(d[j],t)<=r+eps) continue;
t=get(d[i],d[j]);r=dis(d[j],t);
fo(k,1,j-1)
{
if (dis(d[k],t)<=r+eps) continue;
t=get(d[i],d[j],d[k]);r=dis(d[k],t);
}
}
}
printf("%.2lf %.2lf %.2lf\n",t.x,t.y,r);
return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#define LL long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
#define N 1000005
#define eps 1e-8
struct P
{
double x,y;
}d
;
int n;
double dis(P a,P b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
P get(P A,P B,P C)
{
P t;
double a1=B.x-A.x,b1=B.y-A.y,c1=(a1*a1+b1*b1)/2;
double a2=C.x-A.x,b2=C.y-A.y,c2=(a2*a2+b2*b2)/2;
double d=a1*b2-a2*b1;
t.x=A.x+(c1*b2-c2*b1)/d;
t.y=A.y+(a1*c2-a2*c1)/d;
return t;
}
P get(P a,P b)
{
return (P){(a.x+b.x)/2,(a.y+b.y)/2};
}
int main()
{
scanf("%d",&n);
fo(i,1,n) scanf("%lf%lf",&d[i].x,&d[i].y);
P t=d[1];double r=0.0;
fo(i,1,n)
{
if (dis(d[i],t)<=r+eps) continue;
t=d[i];r=0;
fo(j,1,i-1)
{
if (dis(d[j],t)<=r+eps) continue;
t=get(d[i],d[j]);r=dis(d[j],t);
fo(k,1,j-1)
{
if (dis(d[k],t)<=r+eps) continue;
t=get(d[i],d[j],d[k]);r=dis(d[k],t);
}
}
}
printf("%.2lf %.2lf %.2lf\n",t.x,t.y,r);
return 0;
}
相关文章推荐
- 初学算法 - 求凸包的Garham's Scan算法的C++实现
- 【Google Code Jam 2009 round2 problem D】Watering Plants (两圆交点求法详解)
- 计算几何模板
- 计算几何小模板
- BZOJ2829信用卡凸包
- HDU 4922 Hello, Your Package! (计算几何+DP)(WA)
- poj 1514&zoj 1185 Metal Cutting(半平面交)
- UVA 10969 Sweet Dream(圆的相交)
- uva 11177 Fighting Against a Polygonal Monster(凸包与圆的面积交)
- POJ1279 && LA2512 Art Gallery(求多边形的核)
- poj 2540 && uva 10084 Hotter Colder(半平面交)
- 【计算几何】POJ 2318 & POJ 2398
- 【计算几何】POJ 2653
- 【计算几何】POJ 1113
- HDU 5128 The E-pang Palace
- POJ 2318 TOYS(叉积+二分or暴力)
- POJ 2398 Toy Storage(叉积+二分)
- POJ 1228 Grandpa's Estate 计算凸包+判断点在线段上
- POJ 1873 The Fortified Forest 计算凸包
- POJ 2007 Scrambled Polygon 极角排序