代码如下:
#pragma GCC opitimize(2)
#pragma GCC opitimize("Ofast")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<cstdlib>
using namespace std;
#define int long double
#define re register long
const long N=15;
const int T=1e3,cool=0.995,mintemp=1e-15;
int n,node[N][N],dis[N],ans[N],variance;//node[N+2]存目前圆心坐标,dis每个点到圆心的距离
inline int dist(long num)
{
int res=0;
for(re i=1;i<=n;++i)
res+=pow(node[num][i]-node[(long)(n+2)][i],2);
return sqrt(res);
}//点到圆心的距离
inline int energy()
{
int res=0,tot=0;
for(re i=1;i<=n+1;++i)
{
dis[i]=dist(i);
res+=dis[i];
}
res/=(n+1);
for(re i=1;i<=n+1;++i)
tot+=pow(dis[i]-res,2);
return tot;
}
inline void SA()
{
int temp=T;
while(temp>mintemp)
{
int coor[N];
for(re i=1;i<=n;++i)
coor[i]=node[(long)(n+2)][i]+(rand()*2-RAND_MAX)*temp;
int newe=energy();
if(newe<variance)
for(re i=1;i<=n;++i)
{
node[(long)(n+2)][i]=coor[i];
ans[i]=coor[i];
variance=newe;
}
else if(exp(-(newe-variance)/temp)>rand()/RAND_MAX)
for(re i=1;i<=n;++i)node[(long)(n+2)][i]=coor[i];
temp*=cool;
}
}
inline void starts()
{
memset(node,0,sizeof(node));
memset(ans,0,sizeof(ans));
}
signed main(void)
{
ios::sync_with_stdio(false);
srand(time(NULL));srand(rand());
cin>>n;
starts();
for(re i=1;i<=n+1;++i)
for(re j=1;j<=n;++j)
cin>>node[i][j];
variance=energy();
while((int)clock()/CLOCKS_PER_SEC<0.8)SA();
//while(variance)SA();
for(re i=1;i<=n;++i)cout<<fixed<<setprecision(3)<<ans[i]<<' ';
//cout<<variance<<endl;
return 0;
}
wa了100分...希望大佬帮帮忙诶