吊打XXX bzoj-3680

题目大意:在平面上给定n个点,每个点有一个权值。请在平面上找出一个点(不一定在这n个点内找)使得这个点到n个点的距离*权值最小,即求这n个点的重心。

注释:$1\le n\le 10^4$,$-10^5\le x_i,y_i\le 10^5$。

想法:

模拟退火裸题。

身为一个随机化算法,模拟退火在时间允许的情况下是完全由于爬山的。模拟退火,说白了就是有一定的接受差解的概率,而爬山算法不会接受错解。换言之,爬山是模拟退火的一种极端情况。

模拟物理的降温,就是模拟退火的精髓,不在赘述。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 10010
double minans=23333333333333333ll;
using namespace std;
int n;
struct Node
{
double x,y,g;
}a[N],ans;
inline double dis(const Node &x,const Node &y)
{
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
double Judge(const Node &p)
{
double re=0;
for(int i=1;i<=n;i++)
{
re+=a[i].g*dis(p,a[i]);
}
if(re<minans) ans=p,minans=re;
return re;
}
double Rand()
{
return 1.0*rand()/RAND_MAX;
}
void Simulate_Anneal(double T)
{
Node Now=ans;
while(T>0.001)
{
Node Neo;
Neo.x=Now.x+T*(Rand()*2-1);
Neo.y=Now.y+T*(Rand()*2-1);
double dlt=Judge(Now)-Judge(Neo);
if(dlt>0 || exp(dlt/T)>Rand() ) Now=Neo;
T*=0.99;
}
for(int i=1;i<=100;i++)
{
Node Neo;
Neo.x=ans.x+T*(Rand()*2-1);
Neo.y=ans.y+T*(Rand()*2-1);
Judge(Neo);
}
}
int main()
{
srand(19260817);//万里长城永不倒,我为长者续一秒
cin >> n ;
for(int i=1;i<=n;i++)
{
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].g);
ans.x+=a[i].x,ans.y+=a[i].y;
}
ans.x/=n,ans.y/=n;
Simulate_Anneal(10000);
printf("%.3lf %.3lf\n",ans.x,ans.y);
return 0;
}

小结:模拟退火其实是很强的,但是作为一个OIer能不用还是不用了吧... ...

[bzoj3680]吊打XXX_模拟退火的更多相关文章

  1. BZOJ_3680_吊打XXX_模拟退火

    BZOJ_3680_吊打XXX_模拟退火 Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个g ...

  2. BZOJ3680:吊打XXX(模拟退火)

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

  3. [JSOI2004]平衡点/[BZOJ3680]吊打XXX

    [JSOI2004]平衡点/[BZOJ3680]吊打XXX 题目大意: 有\(n(n\le10000)\)个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.假设绳子 ...

  4. BZOJ3680 吊打XXX 【模拟退火】

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

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

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

  6. bzoj3680: 吊打XXX(模拟退火)

    题目要求 最小(dis表示绳结到点i的距离),就是个广义费马点的题,模拟退火裸题QAQ 模拟退火就是优化后的爬山算法,一开始先随机一个平均点,接下来如果随机到的点比当前点劣,温度比较高的话也有几率跳过 ...

  7. luogu1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)

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

  8. bzoj 3680 吊打xxx 模拟退火

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

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

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

随机推荐

  1. 二分图染色模板(P1330 封锁阳光大学)

    二分图染色模板(P1330 封锁阳光大学) 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校 ...

  2. 【BZOJ 2565】 最长双回文串

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2565 [算法] Manacher [代码] #include<bits/std ...

  3. U32670 小凯的数字 数学

    这是洛谷一个比赛中的一道题,和去年NOIP D1T1挺像.我看了一眼之后想“这不是小学奥数吗?求一个数字和就好了呀”...然后,60,剩下T了,gg. 只好看正解,但是一脸懵逼???然后看了证明,c* ...

  4. 444D

    分类 首先我们要对询问分类,如果相差log级别就第一种询问,否则第二种. 第一种直接暴力lower_bound,复杂度玄学 第二种归并,复杂度玄学 但是就是过了.感觉很容易卡. #include< ...

  5. iOS开发之KVC全解

    一  KVC的基本概念 1.KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过g ...

  6. PCB 内网实现《OCR文字识别》实现逻辑

    一.实现内网信息获取网络图 二. OCR文字识别,运用技术点(啰嗦了,即然写了就都写了一遍) 三. C#客户端实现界面, 设置界面描述功能待完善,

  7. PCB MS SQL 排序应用---相邻数据且相同合并处理

    这是一个很有趣SQL数据处理应用,具体需求如下 ERP需要工程将物料编码相邻的编码合并求和BOM用量,巧妙的用到了已有排序号与分组排序号之间的差值求解 示例: 原数据: 要求转换: 实际转换后数据: ...

  8. E20170817-ts

    panel   n. 镶板; 面; (门.墙等上面的) 嵌板; 控制板; inventory n. 清查; 存货清单; 财产目录,财产目录的编制; 存货总值;

  9. Oracle 循环调用存储过程

    create or replace procedure p_test_loop as --定义一个游标,并将查询结果集赋值给它 CURSOR c1 IS select * from tbltest w ...

  10. SQLServer 里的三种条件判断的用法:Where GroupBy Having

    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似.WHERE 子句搜索条件在进行分组操作之前应用:而 HAVING 搜索条件在进行分组 ...