• 推荐博客:模拟退火总结(模拟退火)by FlashHu。模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值。

  • 题目传送门:luogu1337 [JSOI2004]平衡点 / 吊打XXX

  • 题目转述:平面上有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(模拟退火)的更多相关文章

  1. 洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)

    题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...

  2. LG1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火

    问题描述 LG1337 题解 模拟退火模板 记住概率公式: \(exp(\frac{dealt}{T}) \times rand \ge R_A^ND^M_AX\) zzk太欧了,我交了一版没过他来了 ...

  3. JSOI2004 平衡点 / 吊打XXX [模拟退火]

    题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...

  4. LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)

    传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...

  5. P1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火

    链接 https://www.luogu.org/problemnew/show/P1337 思路 交了好多发,都是wrong 初始值取平均数就1A了 真的是玄学的算法 代码 // luogu-jud ...

  6. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告

    P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...

  7. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX

    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...

  8. [luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】

    题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有 ...

  9. 洛谷P1337 【[JSOI2004]平衡点 / 吊打XXX】(模拟退火)

    洛谷题目传送门 很可惜,充满Mo力的Mo拟退火并不是正解.不过这是一道最适合开始入手Mo拟退火的好题. 对模拟退火还不是很清楚的可以看一下 这道题还真和能量有点关系.达到平衡稳态的时候,物体的总能量应 ...

随机推荐

  1. vim常用插件使用方法整理【持续更】

    nerdtree 和编辑文件一样,通过h j k l移动光标定位切换工作台和目录 ctr+w+h 光标focus左侧树形目录,ctrl+w+l 光标focus右侧文件显示窗口. ctrl+w+w,光标 ...

  2. Django使用mysql数据的流程

    创建一个mysql数据库 1.打开终端(cmd): 输入: mysql -uroot -p 密码:*** 输入: create database 数据库名字; 2.在settings中进行配置 DAT ...

  3. [Odoo12基础教程]之win10中odoo12环境搭建

    所需材料 1.python3.7 2.pycharm社区版及以上 3.postgresSQL10 下载链接:https://www.enterprisedb.com/thank-you-downloa ...

  4. k8s 获取 Pod ip 添加到环境变量

    0x00 事件 有一个需要将 Pod 自身的 ip 地址添加到环境变量的需求,可以在 yaml 文件的 env 中这样设置: env: - name: POD_OWN_IP_ADDRESS value ...

  5. JS三座大山再学习(三、异步和单线程)

    本文已发布在西瓜君的个人博客,原文传送门 前言 写这一篇的时候,西瓜君查阅了很多资料和文章,但是相当多的文章写的都很简单,甚至互相之间有矛盾,这让我很困扰:同时也让我坚定了要写出一篇好的关于JS异步. ...

  6. overflow属性值

    overflow属性的可取值有四种:visible.hidden.scroll.auto visible:不裁剪溢出的内容.浏览器把溢出来的内容呈现在其内容元素的显示区域以外的地方,全部内容在浏览器的 ...

  7. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(2)- Boot配置(ISP_Pin, OTP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRTx ...

  8. adb查看Android app包名

    1. 确保电脑已经安装了adb.exe文件 2. 使用USB连接你的手机到电脑上,输入下图所示的命令后按下回车键:adb devices 3. 使用手机打开某个应用程序 4.回到命令号窗口,输入代码如 ...

  9. Prometheus 安装

    目录 简介 安装部署 环境准备 安装 配置环境变量 配置 启动 简介 prometheus存储的是时序数据,即按相同时序(相同名称和标签),以时间维度存储连续的数据的集合. 时序(time serie ...

  10. Python存储数据的方式

    在Python开发中,数据存储.读取是必不可少的环节,而且可以采用的存储方式也很多,常用的方法有json文件.csv文件.MySQL数据库.Redis数据库以及Mongdb数据库等. 1. json文 ...