[POJ2420]A Star not a Tree?(模拟退火)
题目链接:http://poj.org/problem?id=2420
求费马点,即到所有其他点总和距离最小的点。
一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相当于O(n^2lgn),没意义。
学习一种神贪心,模拟退火。感觉和启发式搜索有点像啊,又有点像牛顿迭代。
思路就是,固定一个点和一个步长,从这个点开始向四个方向扩展,扩展的步长就是当前步长。如果扩展到的点可以更新答案,那么记住这个点,也就是说这个贪心方向(梯度?)是正确的。就可以拿着这个点继续沿着这个方向走了(剩余的方向可以不考虑了)。
如果四个方向都不能走,说明步长过长,这个时候模拟退火,将步长按比率缩小。
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std; typedef pair<double, double> pdd;
#define x first
#define y second
const double eps = 1e-;
const double delta = 0.98;
const int maxn = ;
const int dx[] = {, -, , };
const int dy[] = {, , , -};
int n;
double ret;
pdd cur;
pdd p[maxn]; double dist(pdd a, pdd b) {
double p = a.x - b.x;
double q = a.y - b.y;
return sqrt(p * p + q * q);
} int main() {
// freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
for(int i = ; i < n; i++) {
scanf("%lf %lf", &p[i].x, &p[i].y);
}
int t = ;
ret = 1e100;
cur = pdd(., .);
while(t > eps) {
bool flag = ;
while(flag) {
flag = ;
for(int i = ; i < ; i++) {
pdd pos = pdd(cur.x+dx[i]*t, cur.y+dy[i]*t);
double tmp = .;
for(int j = ; j < n; j++) {
tmp += dist(pos, p[j]);
}
if(ret - tmp > eps) {
ret = tmp;
cur = pos;
flag = ;
break;
}
}
}
t *= delta;
}
printf("%.0f\n", ret);
}
return ;
}
[POJ2420]A Star not a Tree?(模拟退火)的更多相关文章
- poj-2420 A Star not a Tree?(模拟退火算法)
题目链接: A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5219 Accepte ...
- Poj2420 A Star not a Tree? 模拟退火算法
题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...
- poj2420 A Star not a Tree? 模拟退火
题目大意: 给定n个点,求一个点,使其到这n个点的距离最小.(\(n \leq 100\)) 题解 模拟退火上 #include <cmath> #include <cstdio&g ...
- poj2420 A Star not a Tree? 找费马点 模拟退火
题目传送门 题目大意: 给出100个二维平面上的点,让你找到一个新的点,使这个点到其他所有点的距离总和最小. 思路: 模拟退火模板题,我也不懂为什么,而且一个很有意思的点,就是初始点如果是按照我的代码 ...
- uva 10228 - Star not a Tree?(模拟退火)
题目链接:uva 10228 - Star not a Tree? 题目大意:给定若干个点,求费马点(距离全部点的距离和最小的点) 解题思路:模拟退火算法,每次向周围尝试性的移动步长,假设发现更长处, ...
- 【模拟退火】poj2420 A Star not a Tree?
题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点. 模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解.移动的过程中温度缓慢降低,接受更劣解的概率降低. 在网上看到的 ...
- POJ-2420 A Star not a Tree? 梯度下降 | 模拟退火
题目链接:https://cn.vjudge.net/problem/POJ-2420 题意 给出n个点,找一个点,使得这个点到其余所有点距离之和最小. 思路 一开始就在抖机灵考虑梯度下降,猜测是个凸 ...
- POJ 2420 A Star not a Tree?(模拟退火)
题目链接 居然1Y了,以前写的模拟退火很靠谱啊. #include <cstdio> #include <cstring> #include <string> #i ...
- poj2420A Star not a Tree?(模拟退火)
链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 #include <iostream> #include<cstdio> #include< ...
随机推荐
- SpringMVC原理解析-DispatcherServlet初始化以及请求处理过程
- jS正则和WEB框架Django的入门
JS正则 -test 判断字符串是否符合规定的正则表达式 -exec 获取匹配的数据 test的例子: 从上述的例子我们可以看出,如果rep.test匹配到了就返回true,否则返回false exe ...
- ubuntu 安装transmission最新版
访问 www.transmissionbt.com 下载最新版 1)下载transmission:# wget https://transmission.cachefly.net/transmi ...
- Java操作Excel: POI不能创建xlsm问题的方法(源自StackOverFlow)
write to xlsm (Excel 2007) using apache poi POI的下载(记得把其中的jar包全部加到工程里哦)http://mirror.bit.edu.cn/apach ...
- Java里List取并集方法retainAll不能用来判断是否有重复数据!
网上找的源码 public boolean retainAll(Collection<?> c){ boolean modified = false; Iterator&l ...
- 导出Excel And 导出word
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default6.aspx. ...
- nodejs回调函数
阻塞代码实例: main.js var fs=require("fs"); var data=fs.readFileSync("1.txt"); console ...
- 关于ES6的 模块功能 Module 中export import的用法和注意之处
export default 的用法 export default命令用于指定模块的默认输出.显然,一个模块只能有一个默认输出,因此export deault命令只能使用一次.所以,import命令后 ...
- SQL Server取datetime的日期部分
在c#中有个Date属性用于返回日期,其实就是当天0点. DateTime dtNow = DateTime.Now; DateTime dtNow2 = dtNow.Date; Console.Wr ...
- SQL 递归
-- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数 ) SET @Dept_name = N'MIS' ;WITH DEPTS AS( -- 查询指定部门及其下的所有子部门 -- 定位点成员 ...