[BZOJ 3680] 吊打XXX 【模拟退火】
题目链接:BZOJ - 3680
题目分析
这道题是SLYZ的神犇把JSOI的平衡点那道题改了一下题面变成了吊打GTY神犇..Orz
第一次写模拟退火,只能照着别人的代码写,我看的是PoPoQQQ神犇的代码,于是我基本上完全照着写的,代码没什么区别= =
首先是模型的转化,一看这道题目是神奇的物理题,我完全就不会啊。
搜题解,题解是这样的:根据“一切自然变化进行的方向都是使能量降低,因为能量较低的状态比较稳定”的基本物理原理,这个绳结的移动趋势是使整个系统的总能量降低。
这个系统是一个机械系统,每个状态可以看做只具有重力势能,那么为了使所有中重物重力势能的和最小,我们就要使 sigma(d[i] * w[i]) 最大。
其中 d[i] 是绳结到重物 i 的距离,w[i] 是重物 i 的重力。
这样,就是求一个点,到一些顶点的加权距离和最小,是一个广义费马点问题。
可以使用模拟退火算法来求解。
模拟退火算法的步骤:
选定一个初始状态(比如选定所有点坐标的平均数),选定一个初始温度 T 。
当温度大于一个边界值时:
{
随机变化坐标,变化幅度为 T 。
计算新解与当前解的差 DE。
如果新解比当前解优(DE > 0),就用新解替换当前解。
否则以 exp(DE / T) 的概率用新解替换当前解。
温度乘上一个小于1的系数,即降温。
}
这样,随着温度不断降低,变化幅度也越来越小,接受一个更劣的解的概率也越来越小。
最终求出一个坐标。
为了使答案尽量优,再以这个求出的坐标为基准向四周随机移动若干次,取最优解。
代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; typedef double DB; const int MaxN = 10000 + 5; int n; DB Ansx, Ansy, Dis;
DB X[MaxN], Y[MaxN], W[MaxN]; inline DB Sqr(DB x) {return x * x;} inline DB d(DB x, DB y, DB xx, DB yy)
{
return sqrt(Sqr(x - xx) + Sqr(y - yy));
} DB Calc(DB x, DB y)
{
DB ret = 0;
for (int i = 1; i <= n; ++i)
ret += W[i] * d(x, y, X[i], Y[i]);
if (ret < Dis)
{
Dis = ret;
Ansx = x;
Ansy = y;
}
return ret;
} inline DB Rand()
{
return (DB)(rand() % 10000) / 10000.0;
} void SA()
{
DB DE, T = 100000;
DB Nowx, Nowy, Nx, Ny;
Nowx = Ansx; Nowy = Ansy;
while (T > 0.001)
{
Nx = Nowx + T * (Rand() * 2 - 1);
Ny = Nowy + T * (Rand() * 2 - 1);
DE = Calc(Nowx, Nowy) - Calc(Nx, Ny);
if (DE > 0 || exp(DE / T) > Rand())
{
Nowx = Nx;
Nowy = Ny;
}
T *= 0.97;
}
for (int i = 1; i <= 1000; ++i)
{
Nx = Ansx + T * (Rand() * 2 - 1);
Ny = Ansy + T * (Rand() * 2 - 1);
Calc(Nx, Ny);
}
} int main()
{
srand(804589);
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%lf%lf%lf", &X[i], &Y[i], &W[i]);
Ansx += X[i];
Ansy += Y[i];
}
Ansx /= (DB)n;
Ansy /= (DB)n;
Dis = Calc(Ansx, Ansy);
SA();
printf("%.3lf %.3lf\n", Ansx, Ansy);
return 0;
}
[BZOJ 3680] 吊打XXX 【模拟退火】的更多相关文章
- bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火
每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边. 如果新解优,更新ans. 把原式拆一下,就可以用int存了. bzoj ...
- 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火
题目:https://www.luogu.org/problemnew/show/P1337 https://www.lydsy.com/JudgeOnline/problem.php?id=3680 ...
- bzoj 3680 吊打xxx 模拟退火
第一道模拟退火 重心嘛,就是要找到一个点,使其到所有点距离*该点权值和最小 思路:初始化一个T,mint,当T大于mint时,每次随机一个解,如果解比当前解优,直接转移,否则,以某概率(与T正相关)转 ...
- BZOJ.3680.吊打XXX(模拟退火/爬山算法)
题目链接 一个比较好的解释? 模拟退火(Simulated Annealing,SA): (1)初始化一个温度(充分大).初始解状态S.每个T值的迭代次数. (2)对i=1,...,L,做(3)至(7 ...
- BZOJ 3680: 吊打XXX (模拟退火)
//yy:今天简单入门学了下ORZ 爬山算法:兔子朝着比现在高的地方跳去.它找到了不远处的最高山峰.但是这座山不一定是珠穆朗玛峰.这就是爬山算法,它不能保证局部最优值就是全局最优值. 模拟退火:兔子喝 ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
- BZOJ 3680 吊打XXX
Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞 ...
- 3680: 吊打XXX
3680: 吊打XXX 链接 思路: 模拟退火. 代码: 跑的特别慢... #include<cstdio> #include<algorithm> #include<c ...
- 【BZOJ3680】吊打xxx [模拟退火]
吊打XXX Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻 ...
随机推荐
- VC/MFC 下 递归遍历目录下的所有子目录及文件
在MFC下要实现文件夹的递归遍历,可用CFileFind类,依次读取文件夹下的子文件夹和文件,并判断通过判断是文件夹还是文件来决定递归遍历.递归遍历代码如下: /******************* ...
- 文件MD5查看器工具与源码实现及下载
由于工作中经常需要查看文件的MD5值,先前网上找了几个MD5值查看工具,但基本都是选择文件,还没有复制功能,于是今天我就自己编写了个MD5查看工具,支持文件拖拽查看,并可以复制功能. 由于本工具比较小 ...
- CSS hack常用方案(摘选)
邮箱因为默认了line-height?:170%,导致采用table元素时继承问题,可以采用line-height:50% 很好解决. 常 在使用float时,后面的显示不正常,因为继承了float了 ...
- Gradle插件
1.方法数统计 classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.1' apply plugin: 'com.getkeep ...
- 利用Inltellj创建javadoc ,用jd2chm创建chm
现在有些框架都不带javadoc 就需要自己去生成,而且真正用起来还是chm的最方便,所以写篇日志记录一下 下面我就拿struts2的源码来来举个栗子 1.第一步:创建一个空的java项目,导入框架源 ...
- chrome偶尔弹出新窗口的解决方案
最近使用谷歌浏览器,在搜索页点击搜索结果时,偶尔会弹出新窗口,而不是新标签,试验发现,只要将chrome里面安装的google drive app卸载就行了. 当然了,如果此方法不适合你的情况,还可以 ...
- 一个操作Sql2005数据库的类(备份,还原,分离,附加,添加删除用户等操作)(转载)
/* * 更新时间 :2011-09-01 16:06 * 更 新 人 :苏飞 */ using System; using System.Collections.Generic; using Sys ...
- Hibernate session flush
最近做项目时,用到了hibernnate,批量删除10000条数据时,删除时前台将id传到后台,用in匹配去删除,页面直接卡死. 解决方法,将传过来的10000条id分批删除,每删除五百条后,调用ge ...
- Android模拟器对应的电脑快捷键说明
Home键(小房子键) 在键盘上映射的就是home键,这倒是很好记. Menu键 用于打开菜单的按键,在键盘上映射的是F2键,PgUp键同样可以.另外,看英文原文的意思,貌似这个键在某些机型上会被设计 ...
- iOS 跳转到应用所在的App Store市场
代码入下 #import "ViewController.h" @interface ViewController ()<UIWebViewDelegate> @end ...