【BZOJ2428】均分数据(模拟退火)

题面

BZOJ

题解

先说说黄学长的做法:

当温度比较高的时候,贪心

每次随机一个数,把他放进当前和最少的那一组里面

温度足够低的时候就完全随机然后转移

这样子写貌似会挂???

(我只有70分。。,洛谷测的)

然后看到了\(ZSY\)巨神的做法

(太强啦,实在是太强啦,强无敌呀)

对于一个排列,分组强制连续

答案显然唯一,做一遍\(dp\)就好

所以退火的时候每次交换两个位置。。。

不知道为什么这样就过了。。。

懵逼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<ctime>
using namespace std;
#define ll long long
#define RG register
#define MAX 50
#define sqr(x) ((x)*(x))
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m;
int a[MAX],b[MAX],s[MAX];
double Rand(){return rand()%10000/10000;}
double ans=1e50,f[MAX][MAX],avg;
double Calc()
{
memset(f,127,sizeof(f));
for(int i=1;i<=n;++i)s[i]=s[i-1]+a[i];
f[0][0]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
for(int k=0;k<i;++k)
f[i][j]=min(f[i][j],f[k][j-1]+sqr(s[i]-s[k]-avg));
ans=min(ans,f[n][m]);
return f[n][m];
}
void SA(double T)
{
double now=ans;
while(T>1e-9)
{
int x=rand()%n+1,y=rand()%n+1;
if(x==y)continue;
swap(a[x],a[y]);
double nw=Calc();
if(nw<now||exp((now-nw)/T)>Rand())now=nw;
else swap(a[x],a[y]);
T*=0.99;
}
for(int i=1;i<=10000;++i)
{
int x=rand()%n+1,y=rand()%n+1;
swap(a[x],a[y]);Calc();
swap(a[x],a[y]);
}
}
int main()
{
srand(2333);
n=read();m=read();
for(int i=1;i<=n;++i)avg+=1.0*(a[i]=read())/m;
Calc();
SA(100000);
printf("%.2lf\n",sqrt(ans/m));
return 0;
}

【BZOJ2428】均分数据(模拟退火)的更多相关文章

  1. bzoj2428 [HAOI2006]均分数据 模拟退火

    [HAOI2006]均分数据 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 3434  Solved: 1091[Submit][Status][Dis ...

  2. BZOJ2428 均分数据

    2428: [HAOI2006]均分数据 Time Limit: 5 Sec  Memory Limit: 128 MB Description 已知N个正整数:A1.A2.…….An .今要将它们分 ...

  3. BZOJ2428[HAOI2006]均分数据——模拟退火

    题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...

  4. 洛谷P2503 [HAOI2006]均分数据(模拟退火)

    题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...

  5. HAOI2006 均分数据 [模拟退火]

    题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...

  6. bzoj 2428 均分数据 模拟退火

    模拟退火 按照自己的思路打了,结果WA,发现退火最关键的就是初温,降温,和修改次数, 这个题还在外层带了一个循环,骚气 #include<cstdio> #include<iostr ...

  7. BZOJ 2428 JZYZOJ1533 : [HAOI2006]均分数据 模拟退火 随机化

    http://www.lydsy.com/JudgeOnline/problem.php?id=2428 http://172.20.6.3/Problem_Show.asp?id=1533 http ...

  8. P2503 [HAOI2006]均分数据

    P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...

  9. bzoj2428: [HAOI2006]均分数据

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

随机推荐

  1. 11个phpstorm 快捷键介绍

    11个phpstorm 快捷键介绍 http://phpstorm.tips/tips/11-toggling-case

  2. Quartz.NET 3.0 正式发布

    Quartz.NET是一个强大.开源.轻量的作业调度框架,你能够用它来为执行一个作业而创建简单的或复杂的作业调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等.在2017 ...

  3. 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码

    在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...

  4. Yii2自带的验证码背景颜色怎么调?

    看了下面的这张图片你就知道啦!

  5. Apache服务器安装-apache已经卸载,如何删除注册在系统的服务

    cmd进入windows的命令行客户端,执行:sc delete apache 注意:以管理员的身份删除,同理,此方法也可以删除其他类似的服务.例如sc delete MongoDB.

  6. 几个常用的文本处理shell 命令:find、grep、sort、uniq、sed、awk

    find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 查找所有字母开 ...

  7. 老男孩Python全栈开发(92天全)视频教程 自学笔记14

    day14课程内容: 深浅拷贝 #浅拷贝只能拷贝一层s=[1,'a','b']s1=s.copy()#浅拷贝print(s1)#[1, 'a', 'b']s[0]=2print(s1,s)#[1, ' ...

  8. MFC窗口创建、销毁消息流程

    MFC应用程序创建窗口的顺序 1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数,(可以设置窗口风格等等) 2.PreSubclassWindo ...

  9. windows转mac-开发环境搭建(二):mac上java环境搭建

    1.首先下载jdk,地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.安 ...

  10. poj Hotel 线段树

    经典线段树的题. 每个节点存储的信息:左端点连续空房间的长度,右端点连续空房间长度,连续空房间的最大长度. 由于要求每次必须从尽量靠左边的位置进行居住,那么搜索时应尽量让区间起始位置更小: 1.如果当 ...