luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
推荐博客:模拟退火总结(模拟退火)by FlashHu。模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值。
题目转述:平面上有n个点,每个点有自己的位置\(xi\),\(yi\)和权值\(wi\)。求一个新点的位置\(x\),\(y\),使得该点到其余所有点距离与权值之积的和最小。也即\(\sum\limits_{i=1}^n sqrt((x-x[i])^2+(y-y[i])^2)*w[i]\)最小。也即原题中各方块的重力势能最小。
题目分析:对\(x\),\(y\)进行模拟退火。题目中用了\(long\ double\),因为\(double\)总是会锅。另外注意\(RAND\_MAX\)的用法。
AC代码:
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstdlib>
typedef long long ll;
const int maxn = 1000;
const long double D = 0.98;
const long double eps = 1e-14; using namespace std; long double x[maxn+10], y[maxn+10], w[maxn+10]; int n; long double calc(long double xx, long double yy)
{
long double res=0, dx, dy;
for(int i=1; i<=n; i++)
{
dx = x[i]-xx, dy = y[i]-yy;
res += sqrt(dx*dx+dy*dy)*w[i];
}
return res;
} int main()
{
scanf("%d", &n);
long double bx=0, by=0;
for(int i=1; i<=n; i++)
{
scanf("%Lf%Lf%Lf", x+i, y+i, w+i);
bx += x[i]; by += y[i];
}
bx /= n; by /= n; long double best = calc(bx, by);
srand(time(NULL));
int times = 1;
while(times--)
{
long double ans = best;
long double x0 = bx, y0 = by;
for(long double T=50000; T>eps; T*=D)
{
long double x1 = x0 + T*(rand()*2-RAND_MAX);
long double y1 = y0 + T*(rand()*2-RAND_MAX);
long double res = calc(x1, y1);
if(best>res)
best=res,bx=x1,by=y1;
if(ans>res||exp((ans-res)/T)>(long double)rand()/RAND_MAX)
ans=res,x0=x1,y0=y1;
}
}
printf("%.3Lf %.3Lf\n", bx, by);
return 0;
}
luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)的更多相关文章
- 洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...
- LG1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
问题描述 LG1337 题解 模拟退火模板 记住概率公式: \(exp(\frac{dealt}{T}) \times rand \ge R_A^ND^M_AX\) zzk太欧了,我交了一版没过他来了 ...
- JSOI2004 平衡点 / 吊打XXX [模拟退火]
题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...
- LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...
- P1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
链接 https://www.luogu.org/problemnew/show/P1337 思路 交了好多发,都是wrong 初始值取平均数就1A了 真的是玄学的算法 代码 // luogu-jud ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...
- [luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】
题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有 ...
- 洛谷P1337 【[JSOI2004]平衡点 / 吊打XXX】(模拟退火)
洛谷题目传送门 很可惜,充满Mo力的Mo拟退火并不是正解.不过这是一道最适合开始入手Mo拟退火的好题. 对模拟退火还不是很清楚的可以看一下 这道题还真和能量有点关系.达到平衡稳态的时候,物体的总能量应 ...
随机推荐
- Coding,命名是个技术活
来吧 日常编码少不了的事情就是给代码命名,代码中命名的重要性在项目前期不会有太大感受,因为是边做边命名,代码天天见,自然会加深记忆.但到了后期上线后半年一年后,再回过头看的时候,我擦,这个变量是啥意思 ...
- nvidia gtx1050在kali linux系统下安装显卡驱动,且可以使用x-setting切换显卡
转自:https://www.zzhsec.com/255.html 1.更换源[使用中科大或者官方源都可以] 下面使用中科大的源 root@Andy:/home/dnt# vi /etc/apt/s ...
- Tesseract处理规范的文字
- MySQL 格式化时间 成字符串
创建个表: CREATE TABLE `x02基本信息` ( `ID` varchar(32) NOT NULL COMMENT '系统内记录的唯一标识,供系统内部使用.', `名称` varchar ...
- .NET Core Blazor 1-Blazor项目文件分析
.NET Core Blazor 1-Blazor项目文件分析 本节内容为Blazor的基本文件 简介 Blazor是一个使用.NET技术用于代替JavaScript/typescript的前端WEB ...
- c语言基本数据类型short、int、long、char、float、double大小及命名规则
C 语言包含的数据类型: 一.数据类型与“模子”short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 怎么去理解它们呢? 举个例子:见过藕煤 ...
- map.entrySet().iterator()
1.首先创建一个HashMap, Map map= new HashMap(); 2.Iterator iter= map.entrySet().iterator(); 首先是map.entrySet ...
- NSSearchPathForDirectoriesInDomains用法
iPhone会为每一个应用程序生成一个私有目录,这个目录位于: /Users/sundfsun2009/Library/Application Support/iPhone Simulator/Use ...
- DRF Django REST framework 之 序列化(三)
Django 原生 serializer (序列化) 导入模块 from django.core.serializers import serialize 获取queryset 对queryset进行 ...
- react-native 跳转到ios/android 权限设置界面
目录 ios android 1.在android/app/src/main/java/com/<projectname>文件夹下创建opensettings文件夹 2.在opensett ...