AcWing-3167. 星星还是树 -c++题解(模拟退火)
在二维平面上有 n 个点,第 i 个点的坐标为 (xi,yi)。请你找出一个点,使得该点到这 n个点的距离之和最小。该点可以选择在平面中的任意位置,甚至与这 n个点的位置重合。
输入格式
第一行包含一个整数 n。接下来 n行,每行包含两个整数 xi,yi,表示其中一个点的位置坐标。
输出格式
输出最小距离和,答案四舍五入取整。
数据范围
1≤n≤100,0≤xi,yi≤10000
输入样例:
4
0 0
0 10000
10000 10000
10000 0

输出样例:
28284

详解:代码注释(提前了解模拟退火算法的过程)
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<utility>
#include<stdlib.h>
#include<stdio.h> using namespace std; typedef long long ll;
#define x first //给pair的两个成员起别名
#define y second
#define N 110 //最大范围
typedef pair<double, double> pdd;
int n;
pdd p[N]; //存坐标的变量
double ans = 1e9; //存答案的变量 double dist(pdd a, pdd b) //计算两点距离
{
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx*dx+dy*dy);
} double s_dist(pdd a) //将随机到的一个点与输入的点计算距离
{
double ret = 0; //存随机点的距离
for (int i = 0; i < n; i++)ret += dist(p[i], a);
ans = min(ret, ans); //与答案比较
return ret;
} double rand(int a, int b) //生成(a,b)的随机数
{
return (double)rand() / RAND_MAX * (b - a) + a;
} void th() //模拟退火
{
pdd a(rand(0, 1e4), rand(0, 1e4)); //随机一个初始点
for (double i = 1e4; i >= 1e-4; i *= 0.99) //退火 for(初始温度;最低温度;衰减因子)
{
pdd temp(rand(a.x-i,a.x+i), rand(a.y-i,a.y+i)); //新随机点
double sub = s_dist(temp) - s_dist(a); //比较两点
//sub<0时,新点较小,所以必然执行a=temp (exp(-x)>1>rand(0,1)),sub>0时可能执行a=temp
if (exp(-sub / i) > rand(0, 1))a = temp;
}
} int main()
{
cin >> n;
for (int i = 0; i < n; i++)cin >> p[i].x >> p[i].y;
for (int i = 0; i < 100; i++)th(); //进行100次模拟退火
printf("%.0f", ans);
return 0;
}
AcWing-3167. 星星还是树 -c++题解(模拟退火)的更多相关文章
- FJUT3574 HOME_W的附加题(带权线段树)题解
题意: 给定n个数a1,a2,a3,……an.和m次操作. 每次操作格式如下 x y k 表示将a[x]替换为y.并求替换后,前k小的数之和 思路:我们用带权线段树维护权值,这里就是维护i的个数n ...
- FJUT seventh的tired树上路径(01字典树)题解
思路(来自题解): 众所周知树上两个点xy的距离是deep[x]+deep[y]-deep[lca(x,y)]*2 然后我们把这个加减法换成异或,我们就会发现,deep[lca(x,y)]被消掉了 所 ...
- AcWing 247. 亚特兰蒂斯 (线段树,扫描线,离散化)
题意:给你\(n\)个矩形,求矩形并的面积. 题解:我们建立坐标轴,然后可以对矩形的横坐标进行排序,之后可以遍历这些横坐标,这个过程可以想像成是一条线从左往右扫过x坐标轴,假如这条线是第一次扫过矩形的 ...
- AcWing 241.楼兰图腾 (树状数组,逆序对)
题意:在二维坐标轴上给你一些点,求出所有由三个点构成的v和∧图案的个数. 题解:因为给出的点是按横坐标的顺序给出的,所以我们可以先遍历然后求出某个点左边比它高和低的点的个数(这个过程简直和用树状数组求 ...
- HDU 5919 Sequence II(主席树)题解
题意:有A1 ~ An组成的数组,给你l r,L = min((l + ans[i - 1]) % n + 1, (r + ans[i - 1]) % n + 1),R = max((l + ans[ ...
- Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)
Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...
- Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)
Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...
- FJUT3701 这也是一道数论题(线段树)题解
Problem Description 好久没出数据结构题,现在赶紧来做道数据结构题热热身 小q现在要去银行,他有个很厉害的bug能看到前面排队的人.假如当前有人正在办理业务,那么肯定要等待前一个人完 ...
- newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解
题目描述 筱玛是个快乐的男孩子. 寒假终于到了,筱玛决定请他的朋友们一起来玩迷阵探险. 迷阵可以看做一个n×nn×n的矩阵A,每个格子上有一个有一个数Ai,j. 入口在左上角的(1,1)处,出口在右下 ...
随机推荐
- Mysql查询优化器之关于JOIN的优化
连接查询应该是比较常用的查询方式,连接查询大致分为:内连接.外连接(左连接和右连接).自然连接 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 ...
- Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同. 1).properties app.user.name = javastack 2).yml app: ...
- 什么是Hystrix断路器?我们需要它吗?
由于某些原因,employee-consumer公开服务会引发异常.情况下使用Hystrix我们定义了回退方法.如果在公开服务中发生异常,则回退方法返回一些默认值 . 如果firstPage metho ...
- forward和redirect的区别?http状态码301,302分别代表什么?
一.forward和redirect的区别 从地址栏显示来说:forward是服务器内部重定向,客户端浏览器的网址不会发生变化:redirect发生一个状态码,告诉服务器去重新请求那个网址,显示的的新 ...
- Servlet与JSP之间相互传值问题
一.JSP向Servlet传值 JSP向Servlet传值的方式有三种:URL后面跟参数.form表单提交.在JSP内置对象Session设置值. URL后面跟参数 JSP文件:<a href= ...
- 经历了源码的痛苦,掌握DRF的核心序列化器
目录 DRF的核心--序列化器 序列化器 什么是序列化和反序列化? 序列化 序列化demo 字段类型 字段参数 序列化自定制返回字段 方法一:在序列化类(serializers.py)中写 方法二:在 ...
- CollectionUtils工具类之并集union(arr1,arr2)和差集subtract(arr1,arr2)
一.CollectionUtils工具类之并集union(arr1,arr2)和差集subtract(arr1,arr2) 采用的类: import org.apache.commons.collec ...
- ROS系统-第一讲
ROS是什么 ROS历史起源 ROS总体设计 系统实现 初次实践
- printf()函数压栈a++与++a的输出
printf()中a++与++a的输出问题 在C语言中有个很常用的函数printf(),使用时从右向左压栈,也就是说在printf("%d %d %d %d\n",a,a++,++ ...
- 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用
疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...