原题
题目分析
题目要求将一组数组成两个数,注意不能有前导零,要求差绝对值最小, 所以要取两个位数最接近的数来做差,然后搜就完事了.搜法可以用全排列搜,由于只取两个数,就可以直接取前half个数作为一个数,剩下的作为一个数,做差就行了,这样全排列刚好能遍历所有情况.
代码
1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <string> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <map> 12 #include <set> 13 14 using namespace std; 15 const int INF=0x3f3f3f3f; 16 17 int num[20]; 18 int ans; 19 20 void solve(int n) 21 { 22 do 23 { 24 if(num[0]||n==2||n==3) 25 { 26 int mid=n/2; 27 if(num[mid]||n==2) 28 { 29 int x=num[0],y=num[mid]; 30 for(int i=1;i<mid;i++) x=x*10+num[i]; 31 for(int i=mid+1;i<n;i++) y=y*10+num[i]; 32 ans=min(ans,abs(x-y)); 33 } 34 } 35 }while(next_permutation(num,num+n)); 36 } 37 38 int main() 39 { 40 // freopen("black.in","r",stdin); 41 // freopen("black.out","w",stdout); 42 int T; 43 cin>>T; 44 getchar(); 45 while(T--) 46 { 47 ans=INF; 48 char x; 49 int cnt=0; 50 while(~scanf("%c",&x)&&x!=‘\n‘) if(x>=‘0‘&&x<=‘9‘) num[cnt++]=x-‘0‘; 51 sort(num,num+cnt); 52 solve(cnt); 53 cout<<ans<<endl; 54 } 55 return 0; 56 }
原文地址:https://www.cnblogs.com/VBEL/p/11396859.html
时间: 2024-11-06 07:24:38