求助退火40pts
查看原帖
求助退火40pts
759389
______l______楼主2022/10/4 11:59

蒟蒻这个退火为什么WA4改个点蒟蒻这个退火为什么WA4改个点

记录

求大佬帮忙查错

#include<bits/stdc++.h>
//#define int long long 
#define ANS fixed<<setprecision(3)
//#define GCC optimize(3,"Ofast","inline")
using namespace std;
inline int time10(int x)
{return(x<<3)+(x<<1);}
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f*=-1;
		if(ch==-1)exit(0);
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
		x=time10(x)+(ch^48),ch=getchar();
	return x*f;
}
inline void write(int x){
	if(x<0)x=-x,putchar('-');
	if(x<10){putchar(x+48);return;}
	write(x/10);putchar(x%10+48);
}const int N=1e2+10;
long double a[N][N],ans[N],answ,t[N],tw;
int n;
inline long double dis(long double a[],long double b[]){
	long double ans=0;
	for(int i=1;i<=n;i++){
		ans+=pow(a[i]-b[i],2);
	}return sqrt(ans);
}
inline long double max(long double k1,long double k2){
	return(k1>k2)?k1:k2;
}
inline long double check(long double k[]){
	long double d=0;
	for(int i=1;i<=n+1;i++)
		d+=dis(k,a[i]);
	d/=(n+1);
	long double ans=0;
	for(int i=1;i<=n+1;i++)
		ans+=pow(dis(k,a[i])-d,2);
	ans/=(n+1);
	return sqrt(ans);
}
inline void solve(){
	long double k=8000;
	while(k>=1e-15){
		for(int i=1;i<=n;i++)
			t[i]=ans[i]+((rand()<<1)-RAND_MAX)*k;
		tw=check(t);
		if(tw<answ){
			for(int i=1;i<=n;i++)
				ans[i]=t[i];
			answ=tw;
		}
		else if(exp((tw-answ)/k)*RAND_MAX<rand())
			for(int i=1;i<=n;i++) ans[i]=t[i];
		k*=0.999;
	}return ;
}
signed main(){
	srand(time(NULL)*3+91346981759836498);
	cin>>n;
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=n;j++)
			cin>>a[i][j],
			ans[j]+=a[i][j]/(n+1);
	}answ=check(ans);
	while((long double)clock()/CLOCKS_PER_SEC<0.97)solve();
//	cout<<answ<<":/";
	for(int i=1;i<=n;i++) cout<<ANS<<ans[i]<<" ";
	fclose(stdin);
	fclose(stdout);
	return 0;
}//205
2022/10/4 11:59
加载中...