3680: 吊打XXX

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 3192  Solved: 1198
[Submit][Status][Discuss]

Description

gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了。蒟蒻们将
n个gty吊在n根绳子上,每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们发现由于每个gty重力不同,绳
结x在移动。蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助。
不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上。

Input

输入第一行为一个正整数n(1<=n<=10000),表示gty的数目。
接下来n行,每行三个整数xi,yi,wi,表示第i个gty的横坐标,纵坐标和重力。
对于20%的数据,gty排列成一条直线。
对于50%的数据,1<=n<=1000。
对于100%的数据,1<=n<=10000,-100000<=xi,yi<=100000

Output

输出1行两个浮点数(保留到小数点后3位),表示最终x的横、纵坐标。

Sample Input

3
0 0 1
0 2 1
1 1 1

Sample Output

0.577 1.000

HINT

Source

By wangxz

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3680

分析:我反正是被坑死啦,这题谁跟我说是水题的,!!!!!模拟退火算法-----高级,爬山算法------今天才听说过QAQ,好的吧,学习一下,毕竟是道裸题~~~

题目大意:给定n个质点,求重心,这n个质点的重心满足Σ(重心到点i的距离)*g[i]最小,模拟退火的裸题,这题INF开0x3f妥妥过不去。。。起码要max_of _long_long附近才可以!

思路:puts("nan nan");得AC//BZOJ貌似是这个样子的呢,很多题这样写都会AC

爬山就够了,模拟退火也可以。

模拟退火就是在模拟一个退火的过程,他和爬山的区别就在于,它多了一个温度参数。

我们可以发现,越到后面,我们就越接近。所以我们应该把修改的范围越改越小,接受较劣解的可能性也应该调小。

于是我们引入一个温度变量T,膜你退火的过程,温度逐渐下降。

下面给出模拟退火的流程:

设定初始较高的温度T

while 温度>设定的最低值

随机得到一个新解(温度越高,新解与旧解的差异越大)

更新答案

根据新解与旧解之间的优劣关系,以一定概率接受新解(越优越有可能)

以一定方式降温

endwhile

为了保证答案的质量,我们可以在最优解附近再进行随机,并更新答案

模拟退火代码如下:【代码跑的很慢很慢。10000ms+】

 #include <bits/stdc++.h>
using namespace std;
const int M=;
struct Node
{
double x,y,g;
}point[M],ans;
int n;
double minans=1e100;
inline double dis(const Node &a,const Node &b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline double judge(const Node &p)
{
int i;
double re=;
for(i=;i<=n;i++)
{
re+=point[i].g*dis(p,point[i]);
}
if(re<minans)
{
ans=p;
minans=re;
}
return re;
}
inline double Rand()
{
return rand()%/1000.0;
}
inline void SA(double T)
{
int i;
Node now=ans;
while(T>0.001)
{
Node Neo;
Neo.x=now.x+T*(Rand()*-);
Neo.y=now.y+T*(Rand()*-);
double de=judge(now)-judge(Neo);
if(de>||exp(de/T)>Rand())
now=Neo;
T*=0.993;
}
for(i=;i<=;i++)
{
Node Neo;
Neo.x=ans.x+T*(Rand()*-);
Neo.y=ans.y+T*(Rand()*-);
judge(Neo);
}
}
int main()
{
int i;
srand();
cin>>n;
for(i=;i<=n;i++)
{
scanf("%lf%lf%lf",&point[i].x,&point[i].y,&point[i].g);
ans.x+=point[i].x;
ans.y+=point[i].y;
}
ans.x/=n;
ans.y/=n;
SA();
printf("%.3lf %.3lf\n",ans.x,ans.y);
return ;
}

爬山算法代码如下【快了8000ms+】

 #include <bits/stdc++.h>
using namespace std;
int n;
double ansx,ansy;
struct data
{
double x,y;
int w;
}p[];
inline double sqr(double x)
{
return x*x;
}
inline double dis(double x,double y,data p)
{
return sqrt(sqr(x-p.x)+sqr(y-p.y));
}
void hillclimb()
{
double t=,x,y;
for(int i=;i<=n;i++)
ansx+=p[i].x*p[i].w,ansy+=p[i].y*p[i].w;
ansx/=n;
ansy/=n;
while(t>0.00000001)
{
x=y=;
for(int i=;i<=n;i++)
{
x+=(p[i].x-ansx)*p[i].w/dis(ansx,ansy,p[i]);
y+=(p[i].y-ansy)*p[i].w/dis(ansx,ansy,p[i]);
}
ansx+=x*t;ansy+=y*t;
if(t>0.5)t*=0.5;
else t*=0.97;
}
printf("%.3lf %.3lf",ansx,ansy);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].w);
hillclimb();
return ;
}

BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】的更多相关文章

  1. BZOJ.3680.吊打XXX(模拟退火/爬山算法)

    题目链接 一个比较好的解释? 模拟退火(Simulated Annealing,SA): (1)初始化一个温度(充分大).初始解状态S.每个T值的迭代次数. (2)对i=1,...,L,做(3)至(7 ...

  2. bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火

    每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边. 如果新解优,更新ans. 把原式拆一下,就可以用int存了. bzoj ...

  3. 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火

    题目:https://www.luogu.org/problemnew/show/P1337 https://www.lydsy.com/JudgeOnline/problem.php?id=3680 ...

  4. bzoj 3680 吊打xxx 模拟退火

    第一道模拟退火 重心嘛,就是要找到一个点,使其到所有点距离*该点权值和最小 思路:初始化一个T,mint,当T大于mint时,每次随机一个解,如果解比当前解优,直接转移,否则,以某概率(与T正相关)转 ...

  5. BZOJ 3680: 吊打XXX (模拟退火)

    //yy:今天简单入门学了下ORZ 爬山算法:兔子朝着比现在高的地方跳去.它找到了不远处的最高山峰.但是这座山不一定是珠穆朗玛峰.这就是爬山算法,它不能保证局部最优值就是全局最优值. 模拟退火:兔子喝 ...

  6. [BZOJ 3680] 吊打XXX 【模拟退火】

    题目链接:BZOJ - 3680 题目分析 这道题是SLYZ的神犇把JSOI的平衡点那道题改了一下题面变成了吊打GTY神犇..Orz 第一次写模拟退火,只能照着别人的代码写,我看的是PoPoQQQ神犇 ...

  7. BZOJ 3680 吊打XXX

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

  8. 3680: 吊打XXX

    3680: 吊打XXX 链接 思路: 模拟退火. 代码: 跑的特别慢... #include<cstdio> #include<algorithm> #include<c ...

  9. 【BZOJ3680】吊打xxx [模拟退火]

    吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻 ...

随机推荐

  1. Linux 文件API

    9/19/2017  开始攻读<LinuxC编程实战>,这是相关的笔记 1.创建 int creat(const char *filename, mode_t mode); 参数mode指 ...

  2. three.js实现3D模型展示

    由于项目需要展示3d模型,所以对three做了点研究,分享出来 希望能帮到大家 先看看效果: three.js整体来说 不是很难 只要你静下心来研究研究 很快就会上手的 首先我们在页面上需要创建一个能 ...

  3. 深入理解 React JS 中的 setState

    此文主要探讨了 React JS 中的 setState 背后的机制,供深入学习 React 研究之用. 在课程 React.js入门基础与案例开发 中,有些同学会发现 React JS 中的 set ...

  4. ffempg支持文件解码

    在做一个数据通道 要求有两个 1.支持打开实时流,解码得到图片 2.支持打开视频文件,得到解码图片 第一个要求前任已经实现 bool FfmpegStreamChr::Open(const char ...

  5. Python学习_12_方法和类定制

    方法 在上一篇随笔中,简单提到了类的某些方法:__init__()等的调用,并简要说明方法和函数的区别. 方法是在类内部定义的函数,方法也是对象,所以方法是类的属性,这就是为什么说实例的方法存在于类定 ...

  6. 为什么树莓派不会受到 Spectre 和 Meltdown 攻击

    最近爆出来的 Intel CPU 的底层漏洞可谓是影响巨大,过去20年的电脑都可能会受影响.前几天 Raspberry Pi 的官方 Twitter(@Raspberry_Pi) 转推了这篇文章,通过 ...

  7. 【读书笔记与思考】《python数据分析与挖掘实战》-张良均

    [读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...

  8. [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

    本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...

  9. Mysql:执行source sql脚本时,出现:error 2

    Centos下部署mysql: 1.yum -y install mysql*; 2.service mysqld start; 3.chkconfig mysqld on; 4.设置用户名和密码:m ...

  10. 关于OC中浮点型的计算

    有时候不得不承认,细心观察生活中的细节,有时候会得到很多. 今天和公司朋友一起订了外卖,因为要分账,就突发奇想用代码来算出每个人花了多少钱.最后发现以前没有注意的细节或者不知道的知识,记录下. 我的代 ...