bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火
每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边。
如果新解优,更新ans。
把原式拆一下,就可以用int存了。
bzoj 2428
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define N 55
- using namespace std;
- int n,m;
- int a[N],sum[N],be[N];
- int ans;
- void solve()
- {
- memset(sum,,sizeof(sum));
- int now=;
- for(int i=;i<=n;i++)
- {
- be[i]=rand()%m+;
- now-=sum[be[i]]*sum[be[i]];
- sum[be[i]]+=a[i];
- now+=sum[be[i]]*sum[be[i]];
- }
- double T=;
- while(T>0.1)
- {
- T*=0.9;
- int x=rand()%n+,b=be[x],y;
- if(T>)y=min_element(sum+,sum+m+)-sum;
- else y=rand()%m+;
- int tmp=now;
- now-=sum[b]*sum[b];sum[b]-=a[x];now+=sum[b]*sum[b];
- now-=sum[y]*sum[y];sum[y]+=a[x];now+=sum[y]*sum[y];
- if(now<tmp)be[x]=y;
- else
- {
- sum[b]+=a[x];sum[y]-=a[x];
- now=tmp;
- }
- }
- ans=min(ans,now);
- }
- int main()
- {
- srand();double sm=;
- ans=0x3f3f3f3f;scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)scanf("%d",&a[i]),sm+=a[i];
- for(int i=;i<=;i++)solve();
- double tt=ans;tt-=sm*sm/m;tt/=m;
- printf("%.2f\n",sqrt(tt));
- return ;
- }
不懂为什么新解没旧解有还要有一定概率接受新解,好像不写也能过。
bzoj 3680
求广义费马点,题意大概就是广义带权费马点的定义吧。$$min(\sum_{i=1}^{n} dis(i,p)*hight[i])$$
参数多调几遍就能过。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define N 10005
- using namespace std;
- int n;
- double x[N],y[N],z[N];
- double ansx,ansy,ans;
- double dis(double x1,double y1,double x2,double y2)
- {
- return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
- }
- inline double calc(double nx,double ny)
- {
- double res=;
- for(int i=;i<=n;i++)
- {
- res+=z[i]*dis(nx,ny,x[i],y[i]);
- }
- return res;
- }
- double f()
- {
- int t=rand()%;
- if(t==)return ;
- return -;
- }
- double rd()
- {
- return rand()%/10000000.0*f();
- }
- void solve()
- {
- double T=1e5;
- while(T>=1e-)
- {
- T*=0.98;
- double xx=ansx+T*rd(),yy=ansy+T*rd();
- double tt=calc(xx,yy);
- if(tt<ans)
- {
- ans=tt;
- ansx=xx;ansy=yy;
- }
- }
- }
- int main()
- {
- srand();
- scanf("%d",&n);
- ans=1e100;
- for(int i=;i<=n;i++)
- {
- scanf("%lf%lf%lf",&x[i],&y[i],&z[i]);
- }
- solve();
- printf("%.3f %.3f\n",ansx,ansy);
- return ;
- }
bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火的更多相关文章
- bzoj 2428: [HAOI2006]均分数据 随机化
2428: [HAOI2006]均分数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)
题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...
- bzoj 2428: [HAOI2006]均分数据
#include<cstdio> #include<iostream> #include<cstdlib> #include<ctime> #inclu ...
- 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火
题目:https://www.luogu.org/problemnew/show/P1337 https://www.lydsy.com/JudgeOnline/problem.php?id=3680 ...
- 2428: [HAOI2006]均分数据
模拟退火.一种十分玄学的随机算法,网上可以查到比较详细的资料. 先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如 ...
- bzoj 3680 吊打xxx 模拟退火
第一道模拟退火 重心嘛,就是要找到一个点,使其到所有点距离*该点权值和最小 思路:初始化一个T,mint,当T大于mint时,每次随机一个解,如果解比当前解优,直接转移,否则,以某概率(与T正相关)转 ...
- BZOJ.3680.吊打XXX(模拟退火/爬山算法)
题目链接 一个比较好的解释? 模拟退火(Simulated Annealing,SA): (1)初始化一个温度(充分大).初始解状态S.每个T值的迭代次数. (2)对i=1,...,L,做(3)至(7 ...
- bzoj2428: [HAOI2006]均分数据
模拟退火.挺好理解的.然后res打成了ans一直WA一直WA...!!!一定要注意嗷嗷嗷一定要注意嗷嗷嗷一定要注意嗷嗷嗷. 然后我就一直卡一直卡...发现最少1800次的时候就可以出解了.然后我就去调 ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
随机推荐
- 关于MySql8.X设置允许root远程登陆的问题
这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...
- DataGridView 复选框 操作大全
DataGridViewCheckBoxColumn dtCheck = new DataGridViewCheckBoxColumn(); dtCheck.DataPropertyName = &q ...
- kafka启动报错:另一个程序正在使用此文件,进程无法访问。
在Windows上启动kafka_2.12-1.1.0报以下错误:[2018-05-08 10:24:51,777] ERROR Failed to clean up log for __consum ...
- web01-helloworld
新建一个Java web项目,名字为web01 在项目中新建一个servlet,名字为SimpleHello 修改doGet()方法,为: public void doGet(HttpServletR ...
- IIs8 svc
IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...
- FileInputStream与FileOutputStream练习题 -------------------图片拷贝
package com.outputstream; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...
- 我现在对Git的认识
由于时间关系,我还没能真正的了解什么是Git,只是大致的了解了一下,并且在网上查阅了资料,做了一些总结,以便进一步研读. Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项 ...
- alpha阶段总结 (第一阶段冲刺成果)
首次接触手机APP的制作,虽然很多都不懂,但是在网上查阅相关知识和询问同学的帮助下,我们团队总算对此有相当的了解,但是因为时间问题,首次冲刺的成果不大,我们相信在下一次的冲刺中会给出更好的效果出来. ...
- C#简单窗体应用程序(二)
使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计登录界面,效果如下: 第一步:创建项目: 文 ...
- Eclipse+MySQL+Tomcat web开发安装配置
转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...