大失败
查看原帖
大失败
360930
Jairon314楼主2021/11/21 01:09

考场上推正解实在推不出来,于是写了个模拟退火。大样例一直过不去(当时可能参数太垃圾),然后觉得肯定过不了,只交了 20 分暴力。大失败,刚调了个参交了个模拟退火洛谷上跑80,infoj跑88

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std;

#define int long long

/***** Fast_IO *****/

namespace IO{
	#define gc getchar
	#define pc putchar
	
	char buc[(1<<21)]; int _=0;
	
	template<class I>
	inline I read(I &x){
		x=0; I f=1; char c=gc();
		while(c<'0'||c>'9'){ if(c=='-'){ f=f*(-1); } c=gc(); }
		while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=gc(); }
		return x=x*f;
	}
	
	template<class I>
	inline void write(I x){
		if(x==0){ pc('0'); return; }
		int tmp=(x<0?(-x):x),cnt=0;
		if(x<0){ pc('-'); }
		while(tmp){ buc[cnt++]=(tmp%10)+'0'; tmp/=10; }
		while(cnt){ pc(buc[--cnt]); }
		return;
	}
	
	#define out(x) write(x),pc(' ')
	#define outn(x) write(x),pc('\n')
	#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
	#define ROF(i,a,b) for(int i=(a);i>=(b);--i)
	#define FORs(i,a,b,s) for(int i=(a);i<=(b);i+=(s))
	#define ROFs(i,a,b,s) for(int i=(a);i>=(b);i-=(s))
}using namespace IO;

/***** Fast_IO *****/

#define maxn 1000010
#define SIZE 5010

const int mod = 998244353;

int qpow(int a,int b){
	int res=1,tmp=a;
	while(b){
		if(b&1){
			res=(res*tmp)%mod;
		} tmp=(tmp*tmp)%mod;
		b>>=1;
	} return res;
}

int inv(int k){ return qpow(k,mod-2); }

int n;
int a[maxn];
int c[maxn];
int p[maxn];

int check(){
	int res=0;
	int ba=0;
	FOR(i,2,n){ a[i]=a[i-1]+c[i]; }
	FOR(i,1,n){
		int val=a[i];
		ba+=val;
	}
	ba=(ba);
	FOR(i,1,n){
		int val=a[i]*n;
		res+=(val-ba)*(val-ba);
	}
	return res/n;
}

int ans=0;
double delta=0.957;

void solve(){
	for(double t=1000;t>1e-5;t*=delta){
		int resx=((rand()%(n-1))+2);
		int resy=((rand()%(n-1))+2);
		swap(c[resx],c[resy]);
		int now=check();
		if(now<ans){ ans=now; }
		else if(exp((double)(ans-now)/t)*RAND_MAX<=rand()){ swap(c[resx],c[resy]); }
	} return;
}

void sa(){ while((double)clock()/CLOCKS_PER_SEC<=0.947){ solve(); } }

signed main(){
	srand(19260817);
// 	freopen("variance.in","r",stdin);
// 	freopen("variance.out","w",stdout);
	read(n);
	if(n==1){ puts("0"); return 0; }
	FOR(i,1,n){ read(a[i]); c[i]=a[i]-a[i-1]; }
	if(n==2){ outn(check()); return 0; }
	ans=0x3f3f3f3f3f3f3f3f;
	sa();
	outn(ans);
	return 0;
}
2021/11/21 01:09
加载中...