爬山太有趣辣
现在觉得调参真是人生中的一大乐趣
我的代码可以0.9过的qwq
就是因为我每次solve都加了一句random_shuffle
然后你就卡不掉我了哈哈哈
rank45
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=' ';
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
const int N=105;
int n,m,belong[N];
double ave,a[N],sum[N];
inline double solve(){
random_shuffle(a+1,a+n+1);
sum[0]=1e100;
for(int i=1;i<=m;++i)sum[i]=0;
for(int i=1;i<=n;++i)belong[i]=rand()%m+1,sum[belong[i]]+=a[i];
double t=1e5,last,ans=0;
for(int i=1;i<=m;++i)ans+=(sum[i]-ave)*(sum[i]-ave);
for(;t>1e-3;t*=0.9){
last=ans;
int x=rand()%n+1,y=0;
if(x<500)y=rand()%m+1;
else for(int i=1;i<=m;++i)if(sum[i]<sum[y])y=i;
ans+=a[x]*(a[x]+sum[y]-sum[belong[x]])*2;
if(ans>last)ans=last;
else{
sum[belong[x]]-=a[x];
belong[x]=y;
sum[belong[x]]+=a[x];
}
}
return ans;
}
int main(){
srand(20020719);
n=read();m=read();double ans=1e100;
for(int i=1;i<=n;++i)a[i]=read(),ave+=a[i];
ave/=m;
for(int i=1;i<=1000;++i)ans=min(ans,solve());
printf("%.2lf",sqrt(ans/m));
return 0;
}