模拟退火leetcode 1879

 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 };

 

posted @ 2022-04-04 23:13  matt-11  阅读(76)  评论(0)    收藏  举报