Bzoj 1336&1337 Alien最小圆覆盖

 

1336: [Balkan2002]Alien最小圆覆盖

Time Limit: 1 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 1473  Solved: 648
[Submit][Status][Discuss]

Description

Input

先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)

Output

Sample Input
6
8.0 9.0
4.0 7.5
1.0 2.0
5.1 8.7
9.0 2.0
4.5 1.0


Sample Output

5.00
5.00 5.00


 

随机增量法求最小圆覆盖。

三重循环。

令ci为前i个点的覆盖圆,新加入一个点i+1时,若其在圆内,跳过,若其在圆外,修改圆心使i+1在圆c(i+1)上。

检查之前的点,令ci为前i个点的覆盖圆,且点j在圆周上,若第i+1个点无法被圆覆盖,修改圆心使点i+1和点j都在圆周上。

检查之前的点,令ci为前i个点的覆盖圆,且点j和点k在圆周上,若第i+1个点无法被圆覆盖,修改圆心使点i+1和点j、点k都在圆周上

这算法倒是还能理解,但是求外心的几何算法表示看不懂。这个技能还是等高二再解锁吧。

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 const double eps=1e-8;
 7 const int mxn=100000;
 8 int n;
 9 struct point{
10     double x,y;
11     friend point operator +(const point a,const point b){
12         return (point){a.x+b.x,a.y+b.y};
13     }
14     friend point operator -(const point a,const point b){
15         return (point){a.x-b.x,a.y-b.y};
16     }
17     friend point operator /(const point a,double b){
18         return (point){a.x/b,a.y/b};
19     }
20 }p[mxn];
21 inline double dis(point a,point b){
22     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
23 }
24 
25 point center(point a,point b,point c){//返回三角形外心 
26     double a1,a2,b1,b2,c1,c2;
27     point ans;
28     a1=2*(b.x-a.x);b1=2*(b.y-a.y);c1=(b.x*b.x)-(a.x*a.x)+(b.y*b.y)-(a.y*a.y);
29     //c1=(a1*a1+b1*b1)/2
30     a2=2*(c.x-a.x);b2=2*(c.y-a.y);c2=(c.x*c.x)-(a.x*a.x)+(c.y*c.y)-(a.y*a.y);
31     //c2=(a2*a2+b2*b2)/2
32     if(fabs(a1)<eps){
33         ans.y=c1/b1;
34         ans.x=(c2-ans.y*b2)/a2;
35     }
36     else if(fabs(b1)<eps){
37         ans.x=c1/a1;
38         ans.y=(c2-ans.x*a2)/b2;
39     }
40     else{
41         ans.x=(c2*b1-c1*b2)/(a2*b1-a1*b2);
42         ans.y=(c2*a1-c1*a2)/(b2*a1-b1*a2);
43     }
44     return ans;
45 }
46 int main(){
47     scanf("%d",&n);
48     int i,j,k;
49     for(i=1;i<=n;i++){
50         scanf("%lf%lf",&p[i].x,&p[i].y);
51     }
52     random_shuffle(p+1,p+n+1);
53     point t=p[1];
54     double r=0.0;
55     for(i=2;i<=n;i++)//
56       if(dis(t,p[i])>r+eps){
57           t=(p[i]+p[1])/2;//默认圆心,等待增量 
58           r=dis(p[i],t);//半径 
59           for(j=2;j<i;j++)// 
60             if(dis(t,p[j])>r+eps){//若有点在圆外,更新圆心 
61                 t=(p[i]+p[j])/2;
62                 r=dis(t,p[i]);
63                 for(k=1;k<j;k++){//最多三点确定一圆 
64                     if(dis(p[k],t)>r+eps){
65                         t=center(p[i],p[j],p[k]);
66                         r=dis(p[i],t);
67                 }
68             }
69         }          
70     }
71     printf("%.10lf\n%.10lf %.10lf",r,t.x,t.y);
72     return 0;
73 }

 

转载于:https://www.cnblogs.com/SilverNebula/p/5659296.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值