题目链接:http://poj.org/problem?id=2420

求费马点,即到所有其他点总和距离最小的点。

一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相当于O(n^2lgn),没意义。

学习一种神贪心,模拟退火。感觉和启发式搜索有点像啊,又有点像牛顿迭代。

  思路就是,固定一个点和一个步长,从这个点开始向四个方向扩展,扩展的步长就是当前步长。如果扩展到的点可以更新答案,那么记住这个点,也就是说这个贪心方向(梯度?)是正确的。就可以拿着这个点继续沿着这个方向走了(剩余的方向可以不考虑了)。

  如果四个方向都不能走,说明步长过长,这个时候模拟退火,将步长按比率缩小。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <cassert>
 8 #include <cstdio>
 9 #include <bitset>
10 #include <vector>
11 #include <deque>
12 #include <queue>
13 #include <stack>
14 #include <ctime>
15 #include <set>
16 #include <map>
17 #include <cmath>
18 using namespace std;
19
20 typedef pair<double, double> pdd;
21 #define x first
22 #define y second
23 const double eps = 1e-8;
24 const double delta = 0.98;
25 const int maxn = 10100;
26 const int dx[5] = {1, -1, 0, 0};
27 const int dy[5] = {0, 0, 1, -1};
28 int n;
29 double ret;
30 pdd cur;
31 pdd p[maxn];
32
33 double dist(pdd a, pdd b) {
34     double p = a.x - b.x;
35     double q = a.y - b.y;
36     return sqrt(p * p + q * q);
37 }
38
39 int main() {
40     // freopen("in", "r", stdin);
41     while(~scanf("%d", &n)) {
42         for(int i = 0; i < n; i++) {
43             scanf("%lf %lf", &p[i].x, &p[i].y);
44         }
45         int t = 100;
46         ret = 1e100;
47         cur = pdd(.0, .0);
48         while(t > eps) {
49             bool flag = 1;
50             while(flag) {
51                 flag = 0;
52                 for(int i = 0; i < 4; i++) {
53                     pdd pos = pdd(cur.x+dx[i]*t, cur.y+dy[i]*t);
54                     double tmp = .0;
55                     for(int j = 0; j < n; j++) {
56                         tmp += dist(pos, p[j]);
57                     }
58                     if(ret - tmp > eps) {
59                         ret = tmp;
60                         cur = pos;
61                         flag = 1;
62                         break;
63                     }
64                 }
65             }
66             t *= delta;
67         }
68         printf("%.0f\n", ret);
69     }
70     return 0;
71 }

转载于:https://www.cnblogs.com/kirai/p/6229822.html

[POJ2420]A Star not a Tree?(模拟退火)相关推荐

  1. Poj2420 A Star not a Tree? 模拟退火算法

    题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...

  2. POJ2420——A Star not a Tree?

    题目链接:http://poj.org/problem?id=2420 A Star not a Tree? 题目大意:求费马点!!!模拟退火即可...... #include<iostream ...

  3. poj2420 A Star not a Tree? 【模拟退火】

    题意:平面上给你n个点,让你求一个点,到这n点的距离和最小 板子得模拟退火,系数也是很好控制,对数器和ACdream得代码跑了1884组样例,结果只有一组不一样,可是我得解更优啊, 交上去RE, 不想 ...

  4. poj2420A Star not a Tree?(模拟退火)

    链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 1 #include <iostream> 2 #include<cstdio> 3 #incl ...

  5. [POJ2420 A Star not a Tree?]

    [关键字]:随机化搜索 模拟退火 [题目大意]:给出n个点,找出一个距离所有点之和最小的点,输出距离. //============================================== ...

  6. POJ 2420 A Star not a Tree?【爬山法】

    题目大意:在二维平面上找出一个点,使它到所有给定点的距离和最小,距离定义为欧氏距离,求这个最小的距离和是多少(结果需要四舍五入)? 思路:如果不能加点,问所有点距离和的最小值那就是经典的MST,如果只 ...

  7. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

  8. 模拟退火(Simulated Annealing)算法 PO J1379 2420

    在很多信息学竞赛选手看来,很多时候几何题目就是代码量大的代名词,即使对于一些经典问题,庞大的代码量也使很多人望而却步.模拟退火算法思维及编写简单.灵活,可以在一类最远.最近或第k近距离问题中发挥威力. ...

  9. javascript终于支持本机私有字段和方法

    JavaScript is known to be quite confusing for beginners as it contains some tricky concepts which re ...

最新文章

  1. 如何获得PMP认证证书
  2. 爱奇艺视频千万级生产 Kubernetes 集群优化实践!
  3. java栈的回收_JAVA的堆栈和内存、垃圾回收解说
  4. python写入中文、用utf-16编码得出二进制字节串_在python中将unicode UTF16数据写入文件时出现问题...
  5. Android SDK Manager无法下载包的问题
  6. lunbuntu install mysql5.7
  7. 112家it公司薪水
  8. eclipse/myeclipse中如何开启断言调试代码
  9. python设置全局变量失败_Python全局变量与global关键字常见错误解决方案
  10. 手机monkey测试BUG重现及解决方法
  11. 使用python连接kafka
  12. Java char jdk_java学习系列之二---字符串(char.String.StringBuilder以及StringBuffer)
  13. 分享一波恋爱社交APP源码,真好~
  14. python文件传输库,利用python库在局域网内传输文件的方法
  15. oligo包常用函数
  16. MTG1000中继网关用户手册
  17. 像素、英寸、厘米的换算
  18. 使用echars制作家谱图
  19. hba卡在服务器什么位置,设置服务器通过HBA卡启动目前服务器主流使用的是Qlogic和Emulex.doc...
  20. csc.exe(C# 编译器)

热门文章

  1. jenkins基本使用
  2. Python Django 基于通用视图实现图片的显示功能代码示例
  3. Hystrix全局配置默认超时时间
  4. CompletableFuture并行异步处理类使用示例
  5. html加载完显示图片,js图片未加载完显示loading效果
  6. linux修改ssh登陆端口号,Linux 6 修改ssh默认远程端口号的操作步骤
  7. java 自旋锁_java锁的种类以及辨析(一):自旋锁
  8. 01.ShardingSphere笔记
  9. mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No suc
  10. 生成和合入patch的两种方式