题意:给出最多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 }