蒟蒻求助爆搜,现在只有12分,悬关
查看原帖
蒟蒻求助爆搜,现在只有12分,悬关
972427
dos_Santos_Aveiro楼主2023/11/14 20:52

爆搜能拿更多分数吗,如果能请问大佬们该咋写

#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define ob pop_back
int n;
const int mod=10000019;
const int base=133;
const int mod2=998244353;
const int base2=131;
const int maxn=1e4+5;
using namespace std;
int a[maxn];
unordered_map<int,int>mp;
unordered_map<int,int>mp2;
vector<int>now;
int b[maxn];
int ans=1e18;
int lst[maxn];
int vis[maxn];
int hash1(){
	int anss=0;
	for(int i=1;i<=n;i++){
		anss=(anss+b[i]*base%mod)%mod;
	}
	return anss;
}
int hash2(){
	int anss=0;
	for(int i=1;i<=n;i++){
		anss=(anss+b[i]*base2%mod2)%mod2;
	}
	return anss;
}
void check(){
	for(int i=1;i<=n;i++) b[i]=a[i];
	for(int i=0;i<now.size();i++){
		b[now[i]]=b[now[i]-1]+b[now[i]+1]-b[now[i]];
	}
	int now=0;	
	for(int i=1;i<=n;i++){
		now+=b[i];
	}
	int noww=0;
	for(int i=1;i<=n;i++){
		noww=noww+(n*b[i]-now)*(n*b[i]-now);
	}
	noww/=n;
	ans=min(ans,noww);
}
void dfs(int x){
	int noww=hash1();
	int nowww=hash2();
	if(mp[noww]&&mp2[nowww]) return;
	mp[noww]=1;
	mp2[nowww]=1;
	for(int i=2;i<n;i++){
		now.pb(i);
		check();
		dfs(x+1);
		now.ob();
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}	
	check();

	dfs(1);
	cout<<ans;
	return 0;
}

2023/11/14 20:52
加载中...