求一个覆盖所有点的最小圆 最小圆覆盖

题目大意:平面上有n个点,求绘制一个半径最小的圆,覆盖所有的点  精度0.1  点的坐标最大为 100000

方法1:http://wenku.baidu.com/view/584b6d3e5727a5e9856a610d.html   O(n)

方法2:三分套三分暴力求解如下。O(1600 n)时间开销  1600~(log  2/3  0.1/100000) ^2

 1 float disy(float y,float x)
 2 {
 3     int n=pvec.size();
 4     float Rmin=0;
 5
 6     for(int i=0;i<n;i++)
 7     {
 8         Rmin=max(Rmin,sqrt((pvec[i].y-y)*(pvec[i].y-y)+ (pvec[i].x-x)*(pvec[i].x-x)));
 9     }
10     return Rmin;
11 }
12 float dis(float x)
13 {
14     ymax=10000,ymin=0;
15     while(ymax-ymin>accu)
16     {
17         if(disy(ymin+(ymax-ymin)*2.0/3,x)<disy(ymin+(ymax-ymin)*1.0/3,x))
18         {
19             ymin=ymin+(ymax-ymin)*1.0/3;
20         }
21         else
22             ymax=ymin+(ymax-ymin)*2.0/3;
23     }
24     return disy((ymax+ymin)/2,x);
25 }
26 int findcenter(POINT &pstart)
27 {
28     xmax=0,xmin=10000;
29     int n=pvec.size();
30     for(int i=0;i<n;i++)
31     {
32         xmax=max(xmax,pvec[i].x);
33         xmin=min(xmin,pvec[i].x);
34     }
35     while((xmax-xmin)/2>accu)
36     {
37         if(dis(xmin+(xmax-xmin)*1.0/3)<dis(xmin+(xmax-xmin)*2.0/3))
38         {
39             xmax=xmin+(xmax-xmin)*2.0/3;
40         }
41         else
42             xmin=xmin+(xmax-xmin)*1.0/3;
43     }
44     pstart.x=(xmax+xmin)/2;
45     pstart.y=(ymax+ymin)/2;
46     int r=disy((ymax+ymin)/2,(xmax+xmin)/2);
47     return r;
48 }

光顾着想用什么新方法比较好了,结果没想到最好的方法。。。

时间: 2024-11-05 08:19:35

求一个覆盖所有点的最小圆 最小圆覆盖的相关文章

算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)

题: 给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列.例: S = [1, 2, 3, 2, 4] T = [1, 2, 4] 则S的所有包含T的子序列为: [1, 2, 3, 2, 4] [1, 2, 3, 4] [1, 2, 2, 4] [1, 2, 4] 解: 首先可以拆解为两个问题: 1. 求S的所有子序列:其中又涉及到去重的问题. 2. 求S的所有子序列中包含T的子序列. 暂时先不考虑去重,看看问题1怎么解: 一.求S的子序列 单纯求一个序列的所有子序列的话,就是求序列的

java实现求一个数组里最大值和最小值之前缺省的数的算法

问题描述: 求一个数组里最大值和最小值之间缺省的数,例如 int arrDemo = {1, 3, 7};  那么就要输出最小值1和最大值7之间缺少的数字2,4,5,6 代码如下,有更好的思路欢迎大家在评论区留言讨论 1 package test; 2 3 public class Test { 4 5 static int[] array = { 6 -10,0,3,3,9 7 }; 8 9 private static void printEmptyItems(int[] array) {

求一个n阶方阵对角线元素之和

求一个n阶方阵对角线元素之和? public class shuixian { public static void main(String[] args) {  // TODO 自动生成的方法存根  int sum=0;  Scanner reader=new Scanner(System.in);  System.out.println("请输入方阵的阶数");  int n=reader.nextInt();  int[][] a=new int[n][n];  for(int

求一个矩阵中最大的2*2矩阵(元素和最大)的和

编程题在线编程题30分2/2最大子矩阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Problem Description:求一个矩阵中最大的2*2矩阵(元素和最大)的和.如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3和为17输入m*n的矩阵输出该m*n矩阵的最大2*2子矩阵(元素和最大)的和 样例输入 1 2 0 3 4 ; 2 3 4 5 1 

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

《团队开发一(求一个数组的连续的子数组之和的最大值)》

(1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的数,依此进行到数组终端:但是考虑到求的是连续的子数组,则应该想到除了在按顺序上的连续外,还得考虑到末端与首端的连续,所以按数组顺序依次求解得到的未必就是连续的最大的子数组之和,故此必须在此种情况下也求解出最大子数组之和,方法即是同时从数组的两端依次进行求出各自的最大子数组之和,然后在相遇前求和后与之前所求的最大子数组之和依次相比较,取它们中最大的一个作为连续的最大子

求一个整数的位数

C++ 吧里看到有人求助, 说是想写点代码求一个整数的位数, 以下是我的解决方法: int32_t RecursionIter (const int64_t& num, const int32_t& result) { if (num < 0) { return RecursionIter (-num, result); } else if (num / 10 == 0) { return result; } else { return RecursionIter (num / 10

求一个整数的最大质因数(回答一个群友的问题)

[QQ群: 189191838,对算法和C++感兴趣可以进来] 群里最近每天都聊得很嗨,虽然不一定是技术,更多的是生活,还是非常开心.因为工作.程序只是我们生命中的一小部分,人的幸福与否,更多的由人的业余生活和他的精神世界所决定.和一群陌生的人,扯扯淡,毫无压力的聊聊人生觉得也挺好. 好的,直接奔入主题.情况是这样的,群里有位同学问了一道算法,求一个整数的最大质因数.然后他给出了代码(如下所示),但是测试没有通过. 1 int largest_prime_factor(int n) 2 { 3

求一个字符串的字节长度

编写一个方法 求一个字符串的字节长度 假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as"));

求一个数组的子数组的最大和

如题:求一个数组的子数组的最大和,要求O(n)时间复杂度. 由于有了O(n)时间复杂度的限制,所以暴力求解的O(n^2)方法肯定不行.再考虑递归求一个数组a[n]的子数组的最大和,可以分解为a[i]子数组的最大和以及a[n-i-1]之间的某种情况 a[n]的子数组最大和等于a[i]子数组的最大和: a[n]的子数组最大和等于a[n-i-1]: a[n]的子数组最大和跨a[i]和a[n-i-1]: 递归实现的时间复杂度为O(nlg(n)).最后考虑时间复杂度为O(n)的动态规划实现. /** *