BZOJ2428: [HAOI2006]均分数据 模拟退火
来源:互联网 发布:vnc mac 连windows 编辑:程序博客网 时间:2024/05/20 22:04
题意:N个数分成M组,要求均方差最小
N<=20,M<=6
随机一种分法,然后模拟退火,每次把一个数随机分到另外一组,若rand(0,1)< exp(dt/T)则判定为成功。然而WA了很久,最后知道温度高的时候需要贪心把它放入当前和最小的一组。。。还是不行,于是改成了从头模拟退火20次才终于过了,慢得垫底,真玄学
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>using namespace std;int n,m;int w[20],a[20][21],t[20],sum[20],pos[20];inline double F(){ int asum=0; for(int i=0;i<m;++i) { sum[i]=0; for(int j=1;j<=t[i];++j) sum[i]+=w[a[i][j]]; asum+=sum[i]; } double dx=floor(asum)/m,res=0; for(int i=0;i<m;++i) res+=(sum[i]-dx)*(sum[i]-dx); return res;}inline int move(int x,int p){ int b=pos[x]; for(int i=t[b]--;;--i) { if(a[b][i]==x) { for(;i<=t[b];++i) a[b][i]=a[b][i+1]; break; } } a[p][++t[pos[x]=p]]=x; return b;}inline bool failed(const double &dt,const double &T){ return dt<0.0&&exp(dt/T)<=floor(rand())/RAND_MAX;}inline void random_shuffle(){ int aim; for(int i=0;i<n;++i) { pos[i]=aim=rand()%m; a[aim][++t[aim]]=i; }}inline int greedy_choice(){ int minn=0x7fffffff,res; for(int i=0;i<m;++i) { sum[i]=0; for(int j=1;j<=t[i];++j) sum[i]+=w[a[i][j]]; if(sum[i]<minn) minn=sum[i],res=i; } return res;}inline double fire(){ memset(t,0,sizeof t); double T=1e16,ans,dt,res; int ele,aim,org; random_shuffle(); res=ans=F(); while(T>1e-10) { ele=rand()%n; if(T>1e2) aim=greedy_choice(); else aim=rand()%m; org=move(ele,aim); dt=ans-F(); if(ans-dt<res) res=ans-dt; if(failed(dt,T)) move(ele,org); else ans-=dt; T*=0.999; } return res;}inline void min(double &a,const double &b){ if(b<a) a=b;}int main(){ srand(114514); scanf("%d%d",&n,&m); for(int i=0;i<n;++i) scanf("%d",w+i); double ans=1e10; for(int i=1;i<=20;++i) min(ans,sqrt(fire()/m)); printf("%.2lf\n",ans); return 0;}
0 0
- [BZOJ2428] [HAOI2006]均分数据 && 模拟退火
- BZOJ2428: [HAOI2006]均分数据 模拟退火
- [BZOJ2428][HAOI2006]均分数据(模拟退火)
- bzoj2428 [HAOI2006]均分数据 模拟退火
- BZOJ2428 [HAOI2006]均分数据(模拟退火算法)
- 模拟退火——BZOJ2428/Luogu2503 [HAOI2006]均分数据
- 【HAOI2006】【BZOJ2428】均分数据
- [BZOJ2428][HAOI2006]均分数据
- bzoj2428 [HAOI2006]均分数据
- 【bzoj2428】[HAOI2006]均分数据
- bzoj2428 [ HAOI2006 ] -- 模拟退火
- bzoj:2428: [HAOI2006]均分数据 模拟退火
- BZOJ 2428 [HAOI2006]均分数据 模拟退火
- BZOJ 2428: [HAOI2006]均分数据 模拟退火
- [HAOI2006]均分数据(模拟退火????)
- bzoj2428 均分数据 爬山算法or模拟退火
- 洛谷P2503 BZOJ2428 [HAOI2006]均分数据
- bzoj 2428: [HAOI2006]均分数据 (模拟退火)
- Fragment和ViewPager的简单使用
- Swift语言一览
- MB21,MB_RESERVATION_BADI无法检查预留单所有项次
- 虽然很简单,但都是一些基础的东西,人非圣人,温故而知新.
- NET将关于多线程的功能
- BZOJ2428: [HAOI2006]均分数据 模拟退火
- 蓝牙协议分析_基本概念及Android4.4 BT代码架构
- LeetCode OJ-22.Generate Parentheses(回溯法)
- android 修改电池电量图标介绍
- 【Hibernate框架】关联映射(一对一关联映射)
- Android实验三事件
- VS下EXE可执行文件启动代码剖析(4)_cinit 函数
- Android L日志系统2——JavaAPI与liblog
- linux常用命令大全