如果没有发现差分数组退火能拿多少分
查看原帖
如果没有发现差分数组退火能拿多少分
783233
1925153zty楼主2023/11/7 20:46

试了下只有44分

#include<bits/stdc++.h>
using namespace std;
#define down 0.998
const int N=1e4+5;
int n,hs,minn,lp,cnt;
int a[N];
clock_t ap,app;
int js(int i)
{
	return (a[i-1]+a[i+1]-2*a[i])*((n-1)*(a[i-1]+a[i+1]-a[i])+(n+1)*a[i]-2*hs);
}
//o(1)计算方差变化量
void th()
{
	double T=10000.000;
	while(T>1e-9)
	{
		int p=rand()%(n-2)+2;
		int po=js(p);
		double de=double(po);
		if(po<0)
		{
			minn=min(minn,lp+po);
			int u=a[p];
			a[p]=a[p+1]+a[p-1]-a[p];
			hs=hs+a[p+1]+a[p-1]-2*u;
			lp=lp+po;
		}
		else
		{
			if(exp(-de/T)*RAND_MAX>rand())
			{
				int u=a[p];
			    a[p]=a[p+1]+a[p-1]-a[p];
			    hs=hs+a[p+1]+a[p-1]-2*u;
			    lp=lp+po;
			}
			T*=down;
		}
	}
} 
int main()
{
	srand(time(0));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]),hs+=a[i];
	for(int i=1;i<=n;i++)
	lp+=(n*a[i]-hs)*(n*a[i]-hs);
	lp/=n;
	minn=lp;
	int u=0;
	while((double)clock()/CLOCKS_PER_SEC<0.9)
	u++,th();
	cout<<minn;
}
2023/11/7 20:46
加载中...