题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0)

题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,dfs搜一遍即可。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int inf=0x3f3f3f3f;
 6 int a[12],b[12],n,ans;
 7 bool vis[12];
 8 void solve(int aa)
 9 {
10     int len=0;
11     int bb=0;
12     for(int i=0;i<n;i++)
13         if(!vis[i])
14             b[len++]=a[i],bb=bb*10+a[i];
15     if(b[0]!=0||len==1)
16         ans=min(ans,abs(aa-bb));
17     while(next_permutation(b,b+len))
18     {
19         bb=0;
20         for(int i=0;i<len;i++)
21             bb=bb*10+b[i];
22         if(b[0]!=0||len==1)
23             ans=min(ans,abs(aa-bb));
24     }
25 }
26 void dfs(int k,int res)
27 {
28     if(k==n/2)
29     {
30         solve(res);
31         return;
32     }
33     for(int i=0;i<n;i++)
34     {
35         if(!vis[i])
36         {
37             if(a[i]==0&&k==0&&n>3)
38                 continue;
39             vis[i]=true;
40             dfs(k+1,res*10+a[i]);
41             vis[i]=false;
42         }
43     }
44 }
45 int main()
46 {
47     int T;
48     for(scanf("%d ",&T);T;T--)
49     {
50         n=0;
51         char ch;
52         while((ch=getchar())!='\n')
53         {
54             if(ch==' ')
55                 continue;
56             a[n++]=ch-'0';
57         }
58         ans=inf;
59         memset(vis,false,sizeof(vis));
60         dfs(0,0);
61         printf("%d\n",ans);
62     }
63     return 0;
64 }