最小圆覆盖 随机增量算法 衡阳八…
来源:互联网 发布:毒品网络 百度云 编辑:程序博客网 时间:2024/06/08 06:35
题目:http://61.187.179.132:8080/JudgeOnline/showproblem?problem_id=1337
题目大意: 给定平面上的N(N< 100000)个点,求一个最小的圆将所有的点覆盖。
考查点:最小圆覆盖的随机化增量算法。
思路:
从前i个点中选择一个点p,由点i和p确定一个圆,然后枚举i前的其他点,利用张角法看其它点是否在圆中,这样就可以求出由第i个点确定的包含前i个点的圆。但时间复杂度很高,O(n^3),不能ac此题。当时不是每个i都会去更新当前圆,只有i不在当前圆内,才需要更新,又,i不在当前圆内的概率为3/i,因此,如果我们一开始先将数据随机化,则时间复杂度就变为了( ∑(i * 3/i * i ^ 2)) = 3*n^2; 这样的时间复杂度依旧不可以。观察前面的过程,当我们确定了i在圆上的时候,求前i个点构成的圆又使用了张角法,时间复杂度n^2,如果我们求前i个点构成的圆也是用随机增量法,那么时间复杂度就可以进一步降低(∑i * 3/i * i * 3/i)=9*n
这样时间复杂度降到了线性时间复杂度,可以解决本题。
这个过程我认为需要注意两个细节
1:在由i,j确定了圆以后,当添加k时,不会出现钝角三角形的情况,如果有钝角三角形,那么k点是不会在圆外的。
2:再由i,j,k三点确定圆的时候不会有i,j,k共线的情况,即可以用行列式来解二元一次方程组。
提交情况:wrong answer1次, 不明原因(似乎是按多组用例提交的原因)
收获:学会了最小圆覆盖的随机化算法,也是自己第一次用随机化的思想做题,人品很好,0msAC,领悟了随机化的魅力;
经验:提交题目要选对编译环境
ACCode
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define MAXN 200
struct NODE{
};
struct ROUND{
};
NODE point[MAXN];
ROUND now;
void swap(int i, int j){
}
double Get_X(int i, int j, int k){
}//由i,j,k三点确定一个圆,k ==-1时是指用两点确定一个圆, 这是求圆心横坐标
double Get_Y(int i, int j, int k){
}//求圆心纵坐标
double Get_R(double x, double y, intk){
}//利用圆心和圆上一点求半径
int out(int k){
}//判断点k在不在当前圆上
int main(){
}
- 最小圆覆盖 随机增量算法 衡阳八…
- 最小圆覆盖 随机增量算法
- 衡阳八中 1856 数论 C(n,m) % p
- hdu 1007 平面最近点对 随机增量…
- 最小圆覆盖,随机增量法.
- hdu 3932,3007 最小圆覆盖 随机增量法
- 【BZOJ】【P1337】【最小圆覆盖】【题解】【随机增量法】
- 最小圆覆盖(随机增量法&模拟退火法)
- BZOJ 1336 Balkan2002 Alien最小圆覆盖 随机增量法
- BZOJ 1337 最小圆覆盖 随机增量法
- BZOJ 1337 最小圆覆盖 随机增量法
- bzoj 1336 && bzoj 1337 最小圆覆盖 随机增量法
- BZOJ 1336: [Balkan2002]Alien最小圆覆盖 随机增量法
- BZOJ 1336: [Balkan2002]Alien最小圆覆盖 随机增量法
- java 棋盘覆盖程序 算法分析题目
- HDOJ 2544 最短路
- 随机森林 VS Grad…
- 集线器 交换机 路由器 网桥 …
- 黑马程序员 单例设计模式
- hdu 1007 平面最近点对 随机增量…
- hdu1534 差分约束系统
- 二分图最大匹配 建图
- poj 3469 双核cpu 最小割最大流
- 最小圆覆盖 随机增量算法 衡阳八…
- poj1182 并查集
- poj3696 欧拉函数, 欧拉方程
- 编写 android.mk 中 LOCAL_C_INCLUDES 的技巧
- fzu 1759 A^B % C
- BP神经网络参数设置及实例
- 衡阳八中 1856 数论 C(n,m) % p
- fzu 1493 小步大步攻击算法
- hdu2815扩展小步大步攻击