【BZOJ3680】吊打XXX(模拟退火)

【BZOJ3680】吊打XXX(模拟退火)

题面

BZOJ

题解

模拟退火。。。
就是模拟退火
然后这题有毒
各种调参数之后终于\(AC\)了。。
这种题就是玄学呀。。。
温度要调大
最后跑完还要向四周多\(rand\)几次
保证能够找到最优解。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<ctime>
using namespace std;
#define ll long long
#define RG register
#define MAX 20000
#define sqr(x) ((x)*(x))
inline int read()
{
    RG int x=0,t=1;RG char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
struct Node{double x,y,w;}p[MAX],ans;
double mm=1e100;
int n;
double Dis(Node a,Node b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
double Calc(Node P)
{
    double ret=0;
    for(int i=1;i<=n;++i)ret+=p[i].w*Dis(P,p[i]);
    if(ret<mm)mm=ret,ans=P;
    return ret;
}
double Rand(){return rand()%100000/100000.00;}
void SA(double T)
{
    Node now=ans;
    while(T>1e-3)
    {
        Node nw;
        nw.x=now.x+T*(2*Rand()-1);
        nw.y=now.y+T*(2*Rand()-1);
        double dlt=Calc(now)-Calc(nw);
        if(dlt>1e-9||exp(dlt/T)>Rand())now=nw;
        T*=0.97;
    }
    for(int i=1;i<=1000;++i)
    {
        now.x=ans.x+T*(2*Rand()-1);
        now.y=ans.y+T*(2*Rand()-1);
        Calc(now);
    }
}
int main()
{
    n=read();
    for(int i=1;i<=n;++i)ans.x+=p[i].x=read(),ans.y+=p[i].y=read(),p[i].w=read();
    ans.x/=n;ans.y/=n;
    Calc(ans);
    SA(1000);
    printf("%.3lf %.3lf\n",ans.x,ans.y);
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8408905.html

时间: 2024-11-05 12:08:28

【BZOJ3680】吊打XXX(模拟退火)的相关文章

P1337 [JSOI2004]平衡点 吊打XXX - 模拟退火

P1337 [JSOI2004]平衡点 吊打XXX 模拟退火 初始温度\(T_0\) 终止温度\(T_k\) 温度变化率\(d\) \(T_k\)略大于0,\(d\)略小于1 当前状态\(x,y\) 当前解\(E\) 当前最优解\(minE\) 当前温度\(T\) 新状态\(nx,ny\) 新解\(nE\) 新解与当前解差值\(\Delta E = nE-E\) \(if\)新解比当前解更优\(nE<E\) 当前状态\(x,y\)移动到 \(nx,ny\) 当前解\(E\)移动到\(nE\) $

【BZOJ3680】吊打XXX 模拟退火

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

bzoj3680: 吊打XXX(模拟退火)

题目要求 最小(dis表示绳结到点i的距离),就是个广义费马点的题,模拟退火裸题QAQ 模拟退火就是优化后的爬山算法,一开始先随机一个平均点,接下来如果随机到的点比当前点劣,温度比较高的话也有几率跳过去,这样就能跳出一个局部最优解,随着温度降低,跳到劣点的概率越来越小 好喵喵的算法! (这题好像黄学长直接爬山算法也过了,模拟退火贼慢T^T #include<iostream> #include<cstring> #include<cstdlib> #include<

bzoj3680 吊打XXX

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

BZOJ 3680 吊打XXX 模拟退火

首先这题应该改名叫吊打出题人 题目大意:给定n个质点,求重心 这n个质点的重心满足Σ(重心到点i的距离)*g[i]最小 模拟退火的裸题 尼玛交了两篇 死活过不去 各种改参数 最后发现是我的INF不够大 尼玛! 这题INF开0x3f妥妥过不去...起码要max_of _long_long附近才可以 最后写了10188MS,BZOJ倒数第一--这也是种艺术啊0.0 #include<cmath> #include<cstdio> #include<cstring> #inc

BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现

吊打XXX

3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 2670  Solved: 984[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由

【BZOJ3680】吊打XXX 广义费马点 模拟退火

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43526909"); } !!!其实我脸一点也不黑!我天天洗脸的! 题解: 我的姿势是先模拟退火,然后少少爬下山来取优. 参数什么的看代码就好. 那个种子的生成方式是[生日^名字首字母的hash] 代码: #include <cmath

[luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX

题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动.蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助. 不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上. 分析 人生中第一道模拟退火题目,感觉模拟退火这个算法非常的优美又非常的(粗鄙之