社区讨论

求助佬大,TLE60pts

P3878[TJOI2010] 分金币参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lzpb80wy
此快照首次捕获于
2024/08/11 16:35
2 年前
此快照最后确认于
2024/08/11 17:38
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define T 100000
#define D 0.99
#define C 100
#define S 19260817
#define EPS 1e-14
using namespace std;
int n,m;
int ans,f_ans,ba;
int s[2];
int a[86];
int f[86];
int sol_val()
{
	return abs(s[0]-s[1]);
}
void sol()
{
	double t=T;
	while(t>EPS)
	{
		int x=rand()%n+1;
		int y=rand()%n+1;
		while(x==y||f[x]==f[y])y=rand()%n+1;
		s[f[x]]-=a[x];
		s[f[y]]-=a[y];
		swap(f[x],f[y]);
		s[f[x]]+=a[x];
		s[f[y]]+=a[y];
		int dw=sol_val();
		int w=dw-ans;
		if(w<0)
		{
			ans=dw;
			if(ans<f_ans)
			{
				f_ans=ans;
			}
		}
		else if(exp(-w/t)*RAND_MAX>rand())
		{
			ans=dw;
		}
		else {
			s[f[x]]-=a[x];
			s[f[y]]-=a[y];
			swap(f[x],f[y]);
			s[f[x]]+=a[x];
			s[f[y]]+=a[y];
		}
		t*=D;
	}
}
void run()
{
	srand(S);
	s[0]=s[1]=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i]=i%2;
		s[f[i]]+=a[i];
	}
	ans=f_ans=sol_val();
	for(int i=1;i<=C;i++)sol();
	cout<<f_ans<<endl;
	return;
}
signed main(){
	int TTTTTTTTTTTTTTTTTT;
	cin>>TTTTTTTTTTTTTTTTTT;
	while(TTTTTTTTTTTTTTTTTT--)run();
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...