这个东西能调过去吗?
查看原帖
这个东西能调过去吗?
184500
hanzhongtlx楼主2020/11/7 09:10

果断模拟退火,然而因为调参太菜最多只有 8686 分,求出大佬/kk

#include"algorithm"
#include"iostream"
#include"cstdio"
#include"ctime"
#include"cmath"
using namespace std;

#define MAXN 100005
#define read(x) scanf("%d",&x)

int n,a[MAXN];
int x,y,L,R;
int l=2,r;
int s[MAXN];
double ans=1000000000000.00;
double t;

inline double check(int l,int r)
{
	return (double)(s[n]-s[r]+s[l-1])/(n-r+l-1);
}

inline void SA()
{
	double T=13555,delta=0.968,T0=1e-15;
	while(T>=T0)
	{
		L=x+((rand()<<1)-RAND_MAX)*T;
		R=y+((rand()<<1)-RAND_MAX)*T;
		L=min(L,r),L=max(l,L),R=max(L,R),R=min(R,r);
		double op=check(L,R);
		if(op<ans) x=L,y=R,ans=op;
		else if(rand()<=exp((ans-op)/T)*RAND_MAX) x=L,y=R;
		T*=delta;
	}
}

inline void work(){while((clock()-t)/CLOCKS_PER_SEC<0.995) SA();}

int main()
{
	t=clock();
	srand((int)time(0)),srand(19260817),srand((int)time(0));
	read(n),r=n-1;
	for(register int i=1;i<=n;i++) read(a[i]),s[i]=s[i-1]+a[i];
	x=n/3,y=2*n/3;
	work();
	printf("%.3lf\n",ans);
	return 0;
}
2020/11/7 09:10
加载中...