1336: [Balkan2002]Alien最小圆覆盖

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

Description

给出N个点,让你画一个最小的包含所有点的圆。

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

HINT

Source

1337: 最小圆覆盖

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 897  Solved: 437
[Submit][Status][Discuss]

Description

给出平面上N个点,N<=10^5.请求出一个半径最小的圆覆盖住所有的点

Input

第一行给出数字N,现在N行,每行两个实数x,y表示其坐标.

Output

输出最小半径,输出保留三位小数.

Sample Input

4
1 0
0 1
0 -1
-1 0

Sample Output

1.000

HINT

Source

Solution

最小圆覆盖裸题,随机增量法

这道题有个需要注意的地方,输出的时候不要只输出2位小数,可能会WA,可以考虑直接输出

直接把课件黏上来= =

Code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdlib>
#include<string>
#include<bitset>
#include<iomanip>
#define INF 1000000000
#define fi first
#define se second
#define N 100005
#define MP(x,y) make_pair(x,y)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
typedef long double Double;struct Vector
{double x,y;Vector(double X=0,double Y=0) {x=X,y=Y;}
};
typedef Vector Point;
typedef vector<Point> Polygon;
const double eps=1e-12;
const double pi=acos(-1.0);
struct Line
{Point P;Vector v;double ang;Line() {}Line(Point P,Vector v):P(P),v(v) {ang=atan2(v.y,v.x);}bool operator<(const Line &L) const {return ang<L.ang;}
};
int dcmp(double x) {if(fabs(x)<eps) return 0; else return x<0? -1:1;}
Vector operator + (Vector A,Vector B) {return ((Vector){A.x+B.x,A.y+B.y});}
Vector operator - (Vector A,Vector B) {return ((Vector){A.x-B.x,A.y-B.y});}
Vector operator * (Vector A,double p) {return ((Vector){A.x*p,A.y*p});}
Vector operator / (Vector A,double p) {return ((Vector){A.x/p,A.y/p});}
bool operator < (const Vector& a,const Vector& b) {return a.x<b.x||(a.x==b.x&&a.y<b.y);}
bool operator == (const Vector& a,const Vector& b) {return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;}
double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
double Len(Vector A) {return sqrt(Dot(A,A));}
double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
Vector Rotate(Vector A,double rad) {return ((Vector){A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad)});}
Point GLI(Point P,Vector v,Point Q,Vector w) {Vector u=P-Q; double t=Cross(w,u)/Cross(v,w); return P+v*t;}
Point GLI(Line a,Line b) {Vector u=a.P-b.P; double t=Cross(b.v,u)/Cross(a.v,b.v);return a.P+a.v*t;}
Point Center_of_gravity(Point A,Point B,Point C)
{Point P=(A+B)/2,Q=(A+C)/2;Vector v=Rotate(B-A,pi/2),w=Rotate(C-A,pi/2);if(dcmp(Len(Cross(v,w)))==0)//这是三点一线的情况
    {if(dcmp(Len(A-B)+Len(B-C)-Len(A-C))==0)return (A+C)/2;if(dcmp(Len(A-C)+Len(B-C)-Len(A-B))==0)return (A+B)/2;if(dcmp(Len(A-B)+Len(A-C)-Len(B-C))==0)return (B+C)/2;}return GLI(P,v,Q,w);
}
double Min_Cover_Circle(Point *p,int n,Point &c)
{random_shuffle(p,p+n);c=p[0];double r=0;int i,j,k;for(i=1;i<n;i++)if(dcmp(Len(c-p[i])-r)>0){c=p[i],r=0;for(j=0;j<i;j++)if(dcmp(Len(c-p[j])-r)>0){c=(p[i]+p[j])/2;r=Len(c-p[i]);for(k=0;k<j;k++)if(dcmp(Len(c-p[k])-r)>0){c=Center_of_gravity(p[i],p[j],p[k]);r=Len(c-p[i]);}}}return r;
}
#define MAXN 100010
Point Po[MAXN];
int main()
{srand(20000104);int n; scanf("%d",&n);for (int i=1; i<=n; i++) {double x,y; scanf("%lf%lf",&x,&y);Po[i-1]=Point(x,y);}Point c;printf("%lf\n",Min_Cover_Circle(Po,n,c));printf("%lf %lf",c.x,c.y);    return 0;
}

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5674663.html

【BZOJ-13361337】Alie最小圆覆盖 最小圆覆盖(随机增量法)相关推荐

  1. 随机增量法:bzoj 1336 bzoj 1337 最小圆覆盖

    1337: 最小圆覆盖 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1170  Solved: 573 [Submit][Status][Discus ...

  2. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)

    如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...

  3. matlab模拟退火最小球覆盖,最小圆覆盖最小球覆盖 (增量法和模拟退火法)

    这种题几乎一套板子走天下. 昨天做最小圆覆盖用的都是增量法,压根没看过退火模拟法,因为退火模拟法并不是很稳定.今天看最小球覆盖时发现用到了退火模拟法,于是看了看最小圆覆盖的退火模拟法,用退火板子提交直 ...

  4. 软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别

    转:软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别 举个例子吧     if   A   and   B   then   Action1     if   C   or   D   then ...

  5. [react] 怎么在JSX里属性可以被覆盖吗?覆盖的原则是什么?

    [react] 怎么在JSX里属性可以被覆盖吗?覆盖的原则是什么? 会被覆盖,类似Object.assign,后面的覆盖前面的 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一 ...

  6. 详述白盒测试的逻辑覆盖的路径覆盖及其优缺点

    详述白盒测试的逻辑覆盖的路径覆盖及其优缺点 定义: 与其他覆盖的关系: 路径覆盖率: 测试用例: 优缺点: 定义: https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢 ...

  7. poj3347——正方形覆盖(区间覆盖)

    题目链接:poj.org/problem?id=3347 In this problem, you are given a sequence S1, S2, ..., Sn of squares of ...

  8. 网络优化之“弱覆盖与过覆盖”

    http://blog.sina.com.cn/s/blog_6617106b0100hzyq.html 弱覆盖 弱覆盖的定义: GSM网络RxLev_DL功率小于-90dBm,或者RSCP小于-90 ...

  9. 判定的测试,语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,组合覆盖,修正的判定条件覆盖

    下面只是个人理解,可能有不准确之处! 1 语句覆盖 2 判定覆盖(分支覆盖) 3 条件覆盖 4 判定/条件覆盖 5 组合覆盖 6 修正的判定/条件覆盖 1 语句覆盖 每个可执行语句都走一遍,即测试用例 ...

  10. 详解软件测试中白盒测试基本概念及四种白盒测试方法以及六种逻辑覆盖法(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)

    在这篇文章中,我们将讲解白盒测试的基本概念,以及四大常用的白盒测试方法. 一.白盒测试基本概念 1.白盒测试的定义 白盒测试又称为结构测试或逻辑驱动测试,它是把测试对象看成一个透明的盒子,它允许测试人 ...

最新文章

  1. Android之如何卸载指定的 应用程序
  2. PHP开发之thinkPHP分层设计
  3. 嵌套中断共享资源问题及解决
  4. linux删除文件后,空间未释放的一种情况,使用lsof查看
  5. 深度学习算法_爱奇艺深度学习算法实习生面经
  6. 转:C#数据结构和算法学习系列十三----链表
  7. 定时任务 Scheduled quartz
  8. linux conda创建虚拟环境
  9. SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
  10. MySQL 获取物理表的主键字段
  11. 分布式系统设计之DB类(来自深空老大)
  12. AVM 拖动组件 movable-view 介绍
  13. Win11后续更新计划:微软将逐步取消传统的控制面板功能
  14. 【FTP】apache FTP Server使用过程中遇到的问题
  15. Python pandas.pivot_table学习笔记1
  16. 猿创征文 |【算法入门必刷】数据结构-栈(五)
  17. 【海思3798系列机顶盒NAS分区表修改软件】
  18. 项目管理 : 如何激发项目成员的工作积极性和热情
  19. 微信模板消息发送成功但显示空白的问题
  20. 网易云信Demo-注册400

热门文章

  1. git 设置忽略文件类型 gitignore
  2. 基于SSM的小区报修系统
  3. 苹果系统备份文件服务器地址,IOS备份到tftp服务器和升级IOS
  4. 微信小程序底部突起半圆设计
  5. springmvc注解详解
  6. JDBC学习(九、连接池技术)
  7. springboot 多环境配置文件
  8. Centos 7 设置 SFTP
  9. linux ubuntu/centos相关收藏
  10. Spring Boot 2.x 集成 SLF4j + log4j2 日志框架