1 //初温尽量调高点,末温如果太小也调大点;玄学;
2 class Solution {
3 public:
4 int minimumXORSum(vector<int>& nums1, vector<int>& nums2) {
5 int ans=INT_MAX;
6 srand(time(0));
7 int n=nums2.size();
8 function<int()>f=[&](){
9 int sum=0;
10 for(int i=0;i<n;i++)sum+=nums1[i]^nums2[i];
11 return sum;
12 };
13 function<void()>mnth=[&](){
14 for(double T=1e6;T>1e-5;T*=0.995)
15 {
16 int x1=rand()%n,x2=rand()%n;
17 swap(nums2[x1],nums2[x2]);
18 int now=f();
19 double del=now-ans;
20 if(del<0)ans=now;
21 else if(exp(-fabs(del)/T)*RAND_MAX<=rand())swap(nums2[x1],nums2[x2]);
22 }
23 };
24 int x=10;
25 while(x--)mnth();
26 return ans;
27 }
28 };