【洛谷1337】[JSOI2004] 吊打XXX(模拟退火经典题)
大致题意: 一个平面上有\(n\)个点,每个点有1个权值,现在要选择平面上的一个点,使这\(n\)个点的权值乘上到达选定点的距离之和最小。
模拟退火
我们可以用模拟退火来做这道题。
先将\((0,0)\)设定为答案,随后不断选取一个新的坐标,比较选择该点时的代价与当前答案的代价。若小于当前答案的代价,则更新答案,否则,将有一定概率更新答案(更新坐标的幅度随时间的增大而减小,更新答案的概率随时间的增大以及两个代价之差的增大而减小)。
只要多模拟退火几遍,或者保持一颗虔诚的心,就能过了。
代码
#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define LL long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define delta 0.99
#define N 1000
using namespace std;
int n,x[N+5],y[N+5],w[N+5];
inline char tc()
{
    static char ff[100000],*A=ff,*B=ff;
    return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
    x=0;int f=1;char ch;
    while(!isdigit(ch=tc())) f=ch^'-'?1:-1;
    while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
    x*=f;
}
inline void write(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
inline double dis(double nx,double ny)//计算出n个点的权值乘上到选定点的距离之和
{
    register int i;double res=0.0;
    for(i=1;i<=n;++i) res+=(double)sqrt((x[i]-nx)*(x[i]-nx)+(y[i]-ny)*(y[i]-ny))*w[i];
    return res;
}
inline void SA(double &X,double &Y)//Simulated Annealing,模拟退火
{
    double tt=3000,res=dis(X,Y);//tt表示变化量,res表示当前代价
    while(tt>0.000000000000001)
    {
        double nx=X+(rand()*2-RAND_MAX)*tt,ny=Y+(rand()*2-RAND_MAX)*tt,new_res=dis(nx,ny);//计算出新的坐标以及新的代价
        if(new_res<res||exp((res-new_res)/tt)*RAND_MAX>rand()) res=new_res,X=nx,Y=ny;//如果新的代价小于当前代价,或在一定的几率下,更新当前状态
        tt*=delta;//将变化量减小,是一个模拟物理学上的退火操作的过程
    }
}
int main()
{
    srand(time(NULL)),srand(rand()),srand(rand());
    register int i;
    for(read(n),i=1;i<=n;++i) read(x[i]),read(y[i]),read(w[i]);
    double ans_x=0.0,ans_y=0.0;
    for(i=1;i<=10;++i) SA(ans_x,ans_y);//模拟退火10次
    return printf("%.3lf %.3lf",ans_x,ans_y),0;
}
【洛谷1337】[JSOI2004] 吊打XXX(模拟退火经典题)的更多相关文章
- 洛谷 - P1337 - 平衡点/吊打XXX
		一眼看过去以为是模拟退火/随机增量之类的.感觉先跑个凸包,然后在凸包内随机转移. 根据力臂长度*重量计算每个方向的分力?判断一个点比原来的点更平衡,是指他们的合力更接近0?每次判断要遍历一次,使用n的 ... 
- 洛谷P4141消失之物(背包经典题)——Chemist
		题目地址:https://www.luogu.org/problemnew/show/P4141 分析:这题当然可以直接暴力枚举去掉哪一个物品,然后每次暴力跑一遍背包,时间复杂度为O(m*n^2),显 ... 
- # [洛谷1337] 吊打XXX/平衡点 (模拟退火)
		[洛谷1337] 吊打XXX/平衡点 (模拟退火) 题意 n个重物(x,y,w),求平衡时x的位置(x,y) 分析 模拟退火基础题,基于随机数的优化算法,时间复杂度玄学,参数玄学,能不能AC看脸,当然 ... 
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
		洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ... 
- bzoj 3680(洛谷1337)  吊打XXX——模拟退火
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3680 https://www.luogu.org/problemnew/show/P1337 ... 
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
		P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ... 
- 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火
		题目:https://www.luogu.org/problemnew/show/P1337 https://www.lydsy.com/JudgeOnline/problem.php?id=3680 ... 
- luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
		推荐博客:模拟退火总结(模拟退火)by FlashHu.模拟退火的原理,差不多就是不断地由现有的值不断地试探,不断地转到更优的值,并在一定概率下转到较差的值. 题目传送门:luogu1337 [JSO ... 
- JSOI2004 平衡点 / 吊打XXX [模拟退火]
		题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ... 
- 【BZOJ3680】吊打xxx [模拟退火]
		吊打XXX Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻 ... 
随机推荐
- python的virtualenv环境与使用
			1.安装virtualenv 在安装virtualenv之前,我们需要安装至少有一个版本的Python:因为virtualenv是python的一个第三方模块,必须基于python环境才能安装: 如果 ... 
- docker 推送镜像到私有地址
			下面针对的都是docker官网的地址 先登录 docker login 输入docker ID ID不是你的注册邮箱,指的是你登录后显示的ID,然后输入密码 ....此时认为你已经登陆成功了 接着看下 ... 
- python之垃圾回收机制
			一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ... 
- 解决Nginx启动失败
			一.Nginx下载http://nginx.org/en/download.html 二.Nginx启动失败原因1.本人下载的是nginx-1.12.1(稳定版),下载完解压后,进入路径中,start ... 
- git教程1-gitlab部署
			https://about.gitlab.com/install/#centos-7 https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/ gitla ... 
- React方法论
			按照目前学习进度不定更新 react渲染的效率,看起来是全体的渲染,其实react在虚拟dom上的处理简直完美.它会过滤掉那些原来就有的东西,不去全体地重复渲染一遍. 即将进入实战,React至今的个 ... 
- matplotlib 知识点11:绘制饼图(pie 函数精讲)
			饼图英文学名为Sector Graph,又名Pie Graph.常用于统计学模块. 画饼图用到的方法为:matplotlib.pyplot.pie( ) #!/usr/bin/env python # ... 
- Jenkins之自动触发部署之插件Generic Webhook Trigger Plugin
			一.安装好插件 二.构建触发器会出现设置trigger的入口 三.设置的两个部分 第一: Jenkins的这个触发器,这里主要是接受post数据.其中Post content parameters是用 ... 
- sleuth使用说明(入门)
			出发点: 微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败.随着 ... 
- Android中常用的几种加密
			1.数字摘要 是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两种,如Android的App签名也是用的这两种算法. md5具有不可逆性,也可用来 ... 
