bzoj2428 [HAOI2006]均分数据 模拟退火
[HAOI2006]均分数据
Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 3434 Solved: 1091
[Submit][Status][Discuss]
Description
已知N个正整数:A1、A2、……、An 。今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小。均方差公式如下:
,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值和。
Input
Output
这一行只包含一个数,表示最小均方差的值(保留小数点后两位数字)。
Sample Input
1 2 3 4 5 6
Sample Output
HINT
对于全部的数据,保证有K<=N <= 20,2<=K<=6
Source
HOME Back
以前也没怎么写过模拟退火,这道题让我知道了一些怎么写
退了10000次火,模拟退火主要靠感觉的吧,
写法也是相当奇怪的
当温度很高的时候,将随机出来的一个数,放入当前组里最小的一组,
当温度比较低的时候,就随机放在一组里,然后判断交换后答案是否更优,是的话就交换,不然随机交换。
- #include<cstring>
- #include<cstdio>
- #include<algorithm>
- #include<iostream>
- #include<cmath>
- #define N 10007
- #define ll long long
- using namespace std;
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
- while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
- return x*f;
- }
- int n,m;
- int sum[N],a[N],belong[N];
- double minans=1e30,ave;
- void SA()
- {
- memset(sum,,sizeof(sum));
- for (int i=;i<=n;i++)
- {
- belong[i]=rand()%m+;
- sum[belong[i]]+=a[i];
- }
- double ans=;
- for (int i=;i<=m;i++)
- ans+=(sum[i]-ave)*(sum[i]-ave);
- double T=;
- while(T>0.1)
- {
- T*=0.9;
- int t=rand()%n+,x=belong[t],y;
- if (T>) y=min_element(sum+,sum+m+)-sum;
- else y=rand()%m+;
- if (x==y) continue;
- double tmp=ans;
- ans-=(sum[x]-ave)*(sum[x]-ave);
- ans-=(sum[y]-ave)*(sum[y]-ave);
- sum[x]-=a[t],sum[y]+=a[t];
- ans+=(sum[x]-ave)*(sum[x]-ave);
- ans+=(sum[y]-ave)*(sum[y]-ave);
- if (ans<=tmp) belong[t]=y;
- else if (rand()%>T) sum[x]+=a[t],sum[y]-=a[t],ans=tmp;
- else belong[t]=y;
- }
- if (ans<minans) minans=ans;
- }
- int main()
- {
- srand();
- n=read(),m=read();
- for (int i=;i<=n;i++)
- a[i]=read(),ave+=a[i];
- ave/=(double)m;
- for (int i=;i<=;i++) SA();
- printf("%.2lf\n",sqrt(minans/m));
- }
bzoj2428 [HAOI2006]均分数据 模拟退火的更多相关文章
- BZOJ2428[HAOI2006]均分数据——模拟退火
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...
- bzoj2428: [HAOI2006]均分数据
模拟退火.挺好理解的.然后res打成了ans一直WA一直WA...!!!一定要注意嗷嗷嗷一定要注意嗷嗷嗷一定要注意嗷嗷嗷. 然后我就一直卡一直卡...发现最少1800次的时候就可以出解了.然后我就去调 ...
- BZOJ2428 HAOI2006均分数据(模拟退火)
显然可以状压dp.显然过不了. 考虑暴力模拟退火.每次随机改变一个数所属集合即可. 并不明白要怎么调参. #include<iostream> #include<cstdio> ...
- 洛谷P2503 [HAOI2006]均分数据(模拟退火)
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- HAOI2006 均分数据 [模拟退火]
题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- BZOJ 2428 JZYZOJ1533 : [HAOI2006]均分数据 模拟退火 随机化
http://www.lydsy.com/JudgeOnline/problem.php?id=2428 http://172.20.6.3/Problem_Show.asp?id=1533 http ...
- P2503 [HAOI2006]均分数据
P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...
- 【BZOJ2428】均分数据(模拟退火)
[BZOJ2428]均分数据(模拟退火) 题面 BZOJ 题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 这样 ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
随机推荐
- (python)leetcode刷题笔记 02 Add Two Numbers
2. Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. ...
- adb 在windows7中的使用
我的系统环境是win7 x64 首先放上资源链接:https://pan.baidu.com/s/1eTV5qX8 密码:2ejw 第一步: 配置环境变量,将adb.exe的路径添加到PATH里面去: ...
- ThreadLocal 线程的私有内存
话说在<操作系统原理>这门课里面,我们学到了很多概念:进程.线程.锁.PV操作.读写者问题等等,大家还记得么?(估计有些概念早已忘记了吧,哈哈哈~) 其中关于进程.线程和锁的东西是我们平时 ...
- 机器学习-聚类Clustering
简介 前面介绍的线性回归,SVM等模型都是基于数据有标签的监督学习方法,本文介绍的聚类方法是属于无标签的无监督学习方法.其他常见的无监督学习还有密度估计,异常检测等. 聚类就是对大量未知标注的数据集, ...
- 基于MTCNN多任务级联卷积神经网络进行的人脸识别 世纪晟人脸检测
神经网络和深度学习目前为处理图像识别的许多问题提供了最佳解决方案,而基于MTCNN(多任务级联卷积神经网络)的人脸检测算法也解决了传统算法对环境要求高.人脸要求高.检测耗时高的弊端. 基于MTCNN多 ...
- 局部加权回归(LWR) Matlab模板
将百度文库上一份局部加权回归的代码,将其改为模板以便复用. q2x,q2y为数据集,是n*1的矩阵: r是波长参数,就是对于距离的惩罚力度: q_x是要拟合的数据横坐标,是1*n的矩阵: 得到的q_y ...
- Simple Expression
Description You probably know that Alex is a very serious mathematician and he likes to solve seriou ...
- Sail
DescriptionThe polar bears are going fishing. They plan to sail from (sx,?sy) to (ex,?ey). However, ...
- JavaScript初探系列之数组的基本操作
在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只 ...
- <Effective C++>读书摘要--Ctors、Dtors and Assignment Operators<二>
<Item 9> Never call virtual functions during construction or destruction 1.you shouldn't call ...