每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边。

 如果新解优,更新ans。

 把原式拆一下,就可以用int存了。

 bzoj 2428

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define N 55
  7. using namespace std;
  8. int n,m;
  9. int a[N],sum[N],be[N];
  10. int ans;
  11. void solve()
  12. {
  13. memset(sum,,sizeof(sum));
  14. int now=;
  15. for(int i=;i<=n;i++)
  16. {
  17. be[i]=rand()%m+;
  18. now-=sum[be[i]]*sum[be[i]];
  19. sum[be[i]]+=a[i];
  20. now+=sum[be[i]]*sum[be[i]];
  21. }
  22. double T=;
  23. while(T>0.1)
  24. {
  25. T*=0.9;
  26. int x=rand()%n+,b=be[x],y;
  27. if(T>)y=min_element(sum+,sum+m+)-sum;
  28. else y=rand()%m+;
  29. int tmp=now;
  30. now-=sum[b]*sum[b];sum[b]-=a[x];now+=sum[b]*sum[b];
  31. now-=sum[y]*sum[y];sum[y]+=a[x];now+=sum[y]*sum[y];
  32. if(now<tmp)be[x]=y;
  33. else
  34. {
  35. sum[b]+=a[x];sum[y]-=a[x];
  36. now=tmp;
  37. }
  38. }
  39. ans=min(ans,now);
  40. }
  41. int main()
  42. {
  43. srand();double sm=;
  44. ans=0x3f3f3f3f;scanf("%d%d",&n,&m);
  45. for(int i=;i<=n;i++)scanf("%d",&a[i]),sm+=a[i];
  46. for(int i=;i<=;i++)solve();
  47. double tt=ans;tt-=sm*sm/m;tt/=m;
  48. printf("%.2f\n",sqrt(tt));
  49. return ;
  50. }

 不懂为什么新解没旧解有还要有一定概率接受新解,好像不写也能过。

  bzoj 3680

求广义费马点,题意大概就是广义带权费马点的定义吧。$$min(\sum_{i=1}^{n} dis(i,p)*hight[i])$$

参数多调几遍就能过。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define N 10005
  7. using namespace std;
  8. int n;
  9. double x[N],y[N],z[N];
  10. double ansx,ansy,ans;
  11. double dis(double x1,double y1,double x2,double y2)
  12. {
  13. return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  14. }
  15. inline double calc(double nx,double ny)
  16. {
  17. double res=;
  18. for(int i=;i<=n;i++)
  19. {
  20. res+=z[i]*dis(nx,ny,x[i],y[i]);
  21. }
  22. return res;
  23. }
  24. double f()
  25. {
  26. int t=rand()%;
  27. if(t==)return ;
  28. return -;
  29. }
  30. double rd()
  31. {
  32. return rand()%/10000000.0*f();
  33. }
  34. void solve()
  35. {
  36. double T=1e5;
  37. while(T>=1e-)
  38. {
  39. T*=0.98;
  40. double xx=ansx+T*rd(),yy=ansy+T*rd();
  41. double tt=calc(xx,yy);
  42. if(tt<ans)
  43. {
  44. ans=tt;
  45. ansx=xx;ansy=yy;
  46. }
  47. }
  48. }
  49. int main()
  50. {
  51. srand();
  52. scanf("%d",&n);
  53. ans=1e100;
  54. for(int i=;i<=n;i++)
  55. {
  56. scanf("%lf%lf%lf",&x[i],&y[i],&z[i]);
  57. }
  58. solve();
  59. printf("%.3f %.3f\n",ansx,ansy);
  60. return ;
  61. }

bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火的更多相关文章

  1. bzoj 2428: [HAOI2006]均分数据 随机化

    2428: [HAOI2006]均分数据 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  2. BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)

    题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...

  3. bzoj 2428: [HAOI2006]均分数据

    #include<cstdio> #include<iostream> #include<cstdlib> #include<ctime> #inclu ...

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

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

  5. 2428: [HAOI2006]均分数据

    模拟退火.一种十分玄学的随机算法,网上可以查到比较详细的资料. 先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如 ...

  6. bzoj 3680 吊打xxx 模拟退火

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

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

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

  8. bzoj2428: [HAOI2006]均分数据

    模拟退火.挺好理解的.然后res打成了ans一直WA一直WA...!!!一定要注意嗷嗷嗷一定要注意嗷嗷嗷一定要注意嗷嗷嗷. 然后我就一直卡一直卡...发现最少1800次的时候就可以出解了.然后我就去调 ...

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

    3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Sub ...

随机推荐

  1. 关于MySql8.X设置允许root远程登陆的问题

    这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...

  2. DataGridView 复选框 操作大全

    DataGridViewCheckBoxColumn dtCheck = new DataGridViewCheckBoxColumn(); dtCheck.DataPropertyName = &q ...

  3. kafka启动报错:另一个程序正在使用此文件,进程无法访问。

    在Windows上启动kafka_2.12-1.1.0报以下错误:[2018-05-08 10:24:51,777] ERROR Failed to clean up log for __consum ...

  4. web01-helloworld

    新建一个Java web项目,名字为web01 在项目中新建一个servlet,名字为SimpleHello 修改doGet()方法,为: public void doGet(HttpServletR ...

  5. IIs8 svc

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  6. FileInputStream与FileOutputStream练习题 -------------------图片拷贝

    package com.outputstream; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...

  7. 我现在对Git的认识

    由于时间关系,我还没能真正的了解什么是Git,只是大致的了解了一下,并且在网上查阅了资料,做了一些总结,以便进一步研读. Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项 ...

  8. alpha阶段总结 (第一阶段冲刺成果)

    首次接触手机APP的制作,虽然很多都不懂,但是在网上查阅相关知识和询问同学的帮助下,我们团队总算对此有相当的了解,但是因为时间问题,首次冲刺的成果不大,我们相信在下一次的冲刺中会给出更好的效果出来. ...

  9. C#简单窗体应用程序(二)

    使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计登录界面,效果如下: 第一步:创建项目: 文 ...

  10. Eclipse+MySQL+Tomcat web开发安装配置

    转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...