还是第一篇题解
查看原帖
还是第一篇题解
93266
断清秋楼主2022/3/19 23:26

没太懂,这篇题解不开 long long 的话随便就卡掉了吧。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define inf 2147483647
#define re register
using namespace std;
int n,ans=inf,a[1005];
int get()
{
    int sum1=0,sum2=0;
    for (re int i=1;i<=(n+1)/2;i++)
     	sum1+=a[i];// a[i]<=2^30,不开 longlong
    for (re int i=(n+1)/2+1;i<=n;i++)
     	sum2+=a[i];
    return abs(sum1-sum2);
}
void SA()
{
    double beginT=5000,endT=1e-10,changeT=0.9112;
    for (re double T=beginT;T>endT;T*=changeT)
    {
       	int x=rand()%n+1, y=rand()%n+1;
        swap(a[x],a[y]);
        long long sum=get();
        if (sum<ans)
        	 ans=sum;
        else 
            if (exp((ans-sum)/T)<(double(rand())/RAND_MAX))
         		swap(a[x],a[y]);
    }
}
int main()
{
    srand(rand());
    int T;
    cin>>T;
    while (T--)
    {
        cin>>n;
    	for(int i=1;i<=n;i++)
     		cin>>a[i];
        int ctrl=1000;
        while(ctrl--)
        	SA();
        cout<<ans<<endl;
        ans=inf;
    }
} 
2022/3/19 23:26
加载中...