博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
随机增量法:bzoj 1336 && bzoj 1337 最小圆覆盖
阅读量:2143 次
发布时间:2019-04-30

本文共 1821 字,大约阅读时间需要 6 分钟。

Time Limit: 1 Sec  
Memory Limit: 64 MB
Submit: 1170  
Solved: 573
[ ][ ][ ]

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

题目:求出n个点的最小圆覆盖

随机增量法:

①将数组重新打乱(random_shuffle()函数)

②假设已经求出了前i个点的最小圆覆盖为Ci,检查第i+1个点是否在圆内,如果在,则C(i+1)=Ci并继续判定下一个点,不在的话,就令C(i+1)的圆心为第1个点和第i+1个点连线的中点,半径为连线长度的一半,并执行步骤③

③重新检查前i个点是否在圆C(i+1)上,如果某个点j不在,就用类似步骤②的方法继续修改圆心和半径使得j点在圆C(i+1)上,并执行步骤④

④再来一次一模一样的检查过程,不过这次只要有点k不在圆上,就令圆C(i+1)的圆心为三角形(i, j, k)的外心并扩增圆C(i+1)的半径

搞定,复杂度O(n^3)不过平均复杂度只有O(n),证明略,应该很容易找到证明

#include
#include
#include
using namespace std;#define eps 1e-8typedef struct Point{ double x; double y;}Point;Point s[100005];Point operator + (const Point a, const Point b){ Point k; k.x = a.x+b.x, k.y = a.y+b.y; return k;}Point operator - (const Point a, const Point b){ Point k; k.x = a.x-b.x, k.y = a.y-b.y; return k;}Point operator / (const Point a, double x){ Point k; k.x = a.x/x, k.y = a.y/x; return k;}Point operator * (const Point a, double x){ Point k; k.x = a.x*x, k.y = a.y*x; return k;}double Dist(Point a, Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}Point Waixin(Point a, Point b, Point c) //求三角形外接圆圆心(外心){ Point ans; double a1, a2, b1, b2, c1, c2; 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); 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); if(fabs(a1)
eps) { P = (s[1]+s[i])/2; R = Dist(P, s[i]); for(j=2;j<=i-1;j++) { if(Dist(P, s[j])-R>eps) { P = (s[i]+s[j])/2; R = Dist(P, s[i]); for(k=1;k<=j-1;k++) { if(Dist(P, s[k])-R>eps) { P = Waixin(s[i], s[j], s[k]); R = Dist(P, s[i]); } } } } } } printf("%.3f\n", R); return 0;}

转载地址:http://xqmgf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>