题目链接

模拟退火:

模拟退火!每次随机一个位置加给sum[]最小的组。

参数真特么玄学啊。。气的不想调了(其实就是想刷刷最优解)

如果用DP去算好像更准。。

//832kb	428ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <assert.h>
#include <algorithm>
#define gc() getchar()
#define D (0.997)//big enough!
#define eps (1e-3)
#define Rand(x) (rand()%x+1)
const int N=22; int n,K,A[N],sum[7],bel[N];
double Ans=1e14,Aver,Tmp; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline double Squ(double x){
return x*x;
}
inline void Move(int fr,int to,int tar){
sum[fr]-=A[tar], sum[bel[tar]=to]+=A[tar];
}
//inline void Update(double &x){
// x=0.0; for(int i=1; i<=K; ++i) x+=Squ(sum[i]);
//} void SA()
{
memset(sum,0,sizeof sum);
for(int i=1; i<=n; ++i) sum[bel[i]=Rand(K)]+=A[i];
double ans=0,nxt;
for(int i=1; i<=K; ++i) ans+=Squ(sum[i]);
Ans=std::min(Ans,ans+Tmp);
for(double T=1e7/*big enough*/; T>eps; T*=D)//Times:6898
{
int tar=Rand(n), fr=bel[tar], to=std::min_element(sum+1,sum+1+K)-sum;
if(fr==to) continue;
nxt=ans-Squ(sum[fr])-Squ(sum[to]);
Move(fr,to,tar);
nxt+=Squ(sum[fr])+Squ(sum[to]);
if(nxt<ans || (exp((ans-nxt)/T)*RAND_MAX>rand())) ans=nxt;//!
else Move(to,fr,tar);
Ans=std::min(Ans,ans+Tmp);//这个放里头!
}
} int main()
{
n=read(),K=read();
int sum=0;
for(int i=1; i<=n; ++i) sum+=(A[i]=read());
Aver=1.0*sum/K, Tmp=K*Aver*Aver-2.0*sum*Aver; // std::random_shuffle(A+1,A+1+n);//这东西。。有时好有时坏
for(int i=1; i<=30; ++i) SA();
printf("%.2lf",sqrt(Ans/(double)K)); return 0;
}

简单好写(错误率高)的裸随机化贪心:

使每组(sum_i-Average)尽量平均(也就是使Σ(sum_i^2)最小)。数据范围这么小,而且只保留两位。。

不连续分组很难办,但是random_shuffle()一下连续分组很多次就可以达到伪不连续分组的效果了。。

具体,我们可以随便分啊按照某种策略来分,比如依次分给当前sum最小的组。

被随机数种子一直卡一个点是怎样的体验。。我特么不设了。

//832kb	2448ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=21; int n,K,A[N],sum[7];
double Ans=1e15,Aver,Tmp; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void Work()
{
std::random_shuffle(A+1,A+1+n);
memset(sum,0,sizeof sum);
for(int i=1; i<=n; ++i)
sum[std::min_element(sum+1,sum+1+K)-sum]+=A[i];
double res=0;
for(int i=1; i<=K; ++i) res+=1.0*sum[i]*sum[i];//Aver可以提出来。。
Ans=std::min(Ans,res+Tmp);
} int main()
{
n=read(),K=read();
int sum=0;
for(int i=1; i<=n; ++i) sum+=(A[i]=read());
Aver=1.0*sum/K, Tmp=K*Aver*Aver-2.0*sum*Aver;
for(int i=1; i<=300000; ++i) Work();
printf("%.2lf",sqrt(Ans/(double)K)); return 0;
}

BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)的更多相关文章

  1. bzoj 2428: [HAOI2006]均分数据 随机化

    2428: [HAOI2006]均分数据 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  2. 洛谷 P2503 [HAOI2006]均分数据 随机化贪心

    洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...

  3. bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火

    每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边. 如果新解优,更新ans. 把原式拆一下,就可以用int存了. bzoj ...

  4. bzoj 2428: [HAOI2006]均分数据

    #include<cstdio> #include<iostream> #include<cstdlib> #include<ctime> #inclu ...

  5. 2428: [HAOI2006]均分数据

    模拟退火.一种十分玄学的随机算法,网上可以查到比较详细的资料. 先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如 ...

  6. bzoj2428: [HAOI2006]均分数据

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

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

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

  8. P2503 [HAOI2006]均分数据

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

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

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

随机推荐

  1. UNIX环境高级编程 第9章 进程关系

    在第8章学习了进程的控制原语,通过各种进程原语可以对进程进行控制,包括新建进程.执行新程序.终止进程等.在使用fork( )产生新进程后,就出现了进程父子进程的概念,这是进程间的关系.本章更加详细地说 ...

  2. 查看linux系统的信息

    #!/bin/sh ################################################## #function:get host's information #Autho ...

  3. OGG-01389 File header failed to parse tokens.

    http://blog.csdn.net/zbdba/article/details/44095105; 处理的思路: 1.查看日志 2.在目标端看最新的队列文件的日期,假如没有最新的队列文件就说明源 ...

  4. 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef

    新建项目启动报错的时候,一直报这个错,类找不到,郁闷了半天,都没百度到结果,后来发现是添加tomcat的时候jre没 指定..... 哈哈哈,太懵逼了,指定就ok了

  5. 一步一步搭建oracle 11gR2 rac+dg之共享磁盘设置(三)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之共享磁盘准备 (三) 注意:这一步是配置rac的过程中非常重要的一步,很多童鞋 ...

  6. 将ipa文件安装到测试设备上的几种方法

    Installing Your App on Test Devices Using Xcode You can install iOS App files on devices using Xcode ...

  7. TF-池化函数 tf.nn.max_pool 的介绍

    转载自此大神 http://blog.csdn.net/mao_xiao_feng/article/details/53453926 max pooling是CNN当中的最大值池化操作,其实用法和卷积 ...

  8. jupyter(ipython notebook) 安装和入门教程

    近期大家无论是自己做数据分析还是紧急答辩做PPT,可能都需要画一些数据的展示图:以前大家都是用excel画图,但excel画图存在一定的局限性,比如你要画个累积直方图,excel就很麻烦了,所以给大家 ...

  9. python_Appium测试环境搭建

    Android环境搭建 移动端Appium环境部署比Web的selenium环境稍微复杂一些,如用python编写测试用例脚本或者开发测试框架以及UI自动化操作方法是一样的,基本是通用.因两者都是基于 ...

  10. [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息

    我最近需要一个用户地域检测来设置用户的默认区域和货币.由 Daniel Stainback 创建的 torann/geoip  很好地满足为Laravel 5 项目提供 GeoIP 服务的要求. 这个 ...