90 pts退火求调
  • 板块P1489 猫狗大战
  • 楼主ZLRest
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/27 22:33
  • 上次更新2023/11/2 17:46:39
查看原帖
90 pts退火求调
753887
ZLRest楼主2023/9/27 22:33
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define dt 0.998
int T,n,mid;
int a[210],s1,s2,ans,odd; 
void sa(){
	double Ti=6000;
	while(Ti>1e-10){
		int x=(int)(rand())%mid+1,y=n-((int)(rand())%(mid+odd)+1);
		int dis=abs(s1-(a[x]<<1)+(a[y]<<1)-s2);
		int D=dis-ans;
		if(D<0){
			ans=dis;
			s1=s1-a[x]+a[y];
			s2=s2-a[y]+a[x];
			swap(a[x],a[y]);
		}
		else if(exp((-D/Ti)*RAND_MAX)>rand()){s1=s1-a[x]+a[y];s2=s2-a[y]+a[x];swap(a[x],a[y]);}
		Ti*=dt;
	}
}
signed main(){
	srand(time(0));
	//srand(rand());
		scanf("%d",&n);
		mid=n/2;
		odd=n%2;
		for(int i=1;i<=n;++i){
			scanf("%d",&a[i]);
			if(i<=mid) s1+=a[i];
				else s2+=a[i];
		}
		if(n==1){printf("0 %d\n",a[1]);return 0;}
		ans=abs(s1-s2);
		sa();
		if(s2<s1)swap(s1,s2);
		if((s1/10)%10==5) s1+=10;
		printf("%d %d\n",s1,s2);
	
	return 0;
}
2023/9/27 22:33
加载中...