bzoj2428 [HAOI2006]均分数据 模拟退火
来源:互联网 发布:淘宝卖家订单险多少钱 编辑:程序博客网 时间:2024/06/05 19:01
题目大意:
把n个数分成m组,要求分的尽量平均,即方差最小,求这个方差。
题目分析:
http://blog.csdn.net/lych_cys/article/details/50843232
我们先随机一个答案,设置一个温度,然后把其中一个数从原来的分组中拿出来,随机放到另一个分组中,并计算答案,如果答案更优,就接受,否则就以一定概率(温度越高概率越大)接受这个答案,并且慢慢降温。
因为模拟退火很有可能接受一个更劣的答案,所以要多做几次来保证答案的正确性。
代码如下:
#include <cstdio>#include <algorithm>#include <cmath>#define N 120using namespace std;inline double sqr(double x) { return x*x; }int n,m,bl[N];double a[N],sum[N],ave;double annealing(){ sum[0]=1e100; for(int i=1;i<=m;i++) sum[i]=0; for(int i=1;i<=n;i++) { bl[i]=rand()%m+1; sum[bl[i]]+=a[i]; } double T=1e4,last,ans=0; for(int i=1;i<=m;i++) ans+=sqr(sum[i]-ave); for(;T>0.1;T*=0.75) { last=ans; int x=rand()%n+1,y=0; if(T<500) y=rand()%m+1; for(int i=1;i<=m;i++) if(sum[i]<sum[y]) y=i; ans+=a[x]*(a[x]+sum[y]-sum[bl[x]])*2; if(ans>last && T<rand()%10000) ans=last; else { sum[bl[x]]-=a[x]; bl[x]=y; sum[y]+=a[x]; } } return ans;}int main(){ srand(20010312); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%lf",&a[i]); ave+=a[i]; } ave/=m; double ans=1e100; for(int i=1;i<=54321;i++) ans=min(ans,annealing()); printf("%.2f",sqrt(ans/m)); 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]均分数据 (模拟退火)
- 日常运维经验分享
- ThinkPHP常用正则表达式
- JavaWeb 之Servlet
- Linux文件权限
- 文章标题
- bzoj2428 [HAOI2006]均分数据 模拟退火
- linux下shuf命令随即排序shuf -n1 a.txt
- jquery下拉菜单
- 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
- MySQL创建和操纵表.md
- 机器学习岗位面试问题汇总 之 深度学习
- 抽奖C代码
- 史上最详细的Android原生APP中添加ReactNative 进行混合开发教程
- 一、基本的HTML标签——四个实例