2428: [HAOI2006]均分数据
模拟退火。
一种十分玄学的随机算法,网上可以查到比较详细的资料。
先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如果没有变小,按模拟退火的玄学方式判断一下,也要交换。
srand(time(0))在bzoj会RE,不知为何。
非常玄学的正确性,没拍多少数据就会出现差别,然而OJ上可以过的。
//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<ctime>
#define Ti 1e4
const int maxn=;
using namespace std;
int n,from[maxn],m;
double tp,ave,ans,p[maxn],sum[maxn];
double pf(double x) {return x*x;}
double solve() {
double res=;
for(int i=;i<=m;i++) sum[i]=;
for(int i=;i<=n;i++) {
from[i]=rand()%m+;
sum[from[i]]+=p[i];
}
for(int i=;i<=m;i++)
res+=pf(sum[i]-ave);
double T=Ti;
while(T>0.1) {
int x=rand()%n+,y;
y=T>?min_element(sum+,sum+m+)-sum:rand()%m+;
tp=res-pf(sum[y]-ave)+pf(sum[y]+p[x]-ave)-pf(sum[from[x]]-ave)+pf(sum[from[x]]-p[x]-ave);
if(tp<res||exp((res-tp)*Ti/T)>(double)rand()/RAND_MAX) {
res=tp;
sum[y]+=p[x];
sum[from[x]]-=p[x];
from[x]=y;
}
T*=0.9;
}
return res;
} int main()
{
srand();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) {
scanf("%lf",&p[i]);
ave+=p[i];
}
ave/=m;
ans=solve();
for(int i=;i<=Ti;i++)
ans=min(ans,solve());
printf("%.2lf\n",sqrt(ans/m));
return ;
}
其实不懂能不能随便放别人博客,侵删
2428: [HAOI2006]均分数据的更多相关文章
- bzoj 2428: [HAOI2006]均分数据 随机化
2428: [HAOI2006]均分数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火
每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边. 如果新解优,更新ans. 把原式拆一下,就可以用int存了. bzoj ...
- BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)
题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...
- bzoj 2428: [HAOI2006]均分数据
#include<cstdio> #include<iostream> #include<cstdlib> #include<ctime> #inclu ...
- bzoj2428: [HAOI2006]均分数据
模拟退火.挺好理解的.然后res打成了ans一直WA一直WA...!!!一定要注意嗷嗷嗷一定要注意嗷嗷嗷一定要注意嗷嗷嗷. 然后我就一直卡一直卡...发现最少1800次的时候就可以出解了.然后我就去调 ...
- P2503 [HAOI2006]均分数据
P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...
- bzoj2428 [HAOI2006]均分数据 模拟退火
[HAOI2006]均分数据 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3434 Solved: 1091[Submit][Status][Dis ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
- BZOJ 2428 JZYZOJ1533 : [HAOI2006]均分数据 模拟退火 随机化
http://www.lydsy.com/JudgeOnline/problem.php?id=2428 http://172.20.6.3/Problem_Show.asp?id=1533 http ...
随机推荐
- Mysql优化-分区
分区简介 分区是根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的 ...
- struts2验证器
1. Struts2 的验证(note6,struts2-8) 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >&g ...
- flink on yarn启动失败
我启动hadoop on yarn 集群后 [root@node1 flink-1.6.1]# ./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 报的如下错误 ...
- 记录一下webpack好用的node模块
postcss-loader autoprefixer: 自动添加css前缀 css-loader: 能在js文件中导入css(配合React比较好,我猜) style-loader: 将所有的计算后 ...
- 2019.7.3模拟 七星连珠(行列式+随机+k进制FWT)
题目大意: 给一个\(n*n\)的矩阵,对于所有排列p,记录\(a[i][p[i]]\)的k进制下不进位加法的结果,问所有被记录过的数. \(n<=50,p=2.3,0<=a[i][j]& ...
- Android中的SrollView滚动详解
今天开发遇到一个需求就是ScrollView中嵌套一个ListView,同时需要实现滑动到底部自动加载更多,我们知道ListView滑动到底部简单实现onScrollListener()监听器即可,但 ...
- 解决Oracle迁移至GreenPlum(PostgreSql)后不支持rownum的问题
只需在查询结果中添加一列 row_number() over() as rownum即可 如: select row_number() over() as rownum , * from table1 ...
- MFC-CString与int互相转化
1. CString转int ; CString str = _T("123"); n = _ttoi(str); 2. int转CString ; CString str; st ...
- The packaging for this project did not assign a file to the build artifact
当进行mvn install时,遇到以下错误 The packaging for this project did not assign a file to the build artifact 在网 ...
- jquery scrollTop() 方法
原文地址:http://www.w3school.com.cn/jquery/css_scrolltop.asp 实例 设置 元素中滚动条的垂直偏移: $(".btn1").cli ...