社区讨论
求助佬大,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 条回复,欢迎继续交流。
正在加载回复...