Description
Input
Output
Sample Input
1 0 1 2 4 6 7
Sample Output
28
思路:假设n为数字个数。如果n为奇数,就选n/2个最大的数从大到小排,剩下的从小到大排(不能有前导零);如果n为偶数,首先选相邻两位的差最小的两个,然后大的那个后面就接小的(从小到大排),小的那个就接大的(从大到小排)。
#include <stdio.h> bool vis[10]; int num[10]; int main() { int t,n,i,j,cnt,num1,num2,minsub,min; char s[20]; scanf("%d\n",&t); while(t--) { gets(s); n=0; for(i=0;s[i]!=0;i++) if(s[i]==‘ ‘) n++; n++; for(i=0;i<n;i++) sscanf(&s[i*2],"%d",&num[i]); num1=num2=0; if(n%2)//如果是奇数个 { cnt=n/2; for(i=n-1;i>=n-cnt;i--) num2=num2*10+num[i]; cnt++; if(!num[0])//有0 { num1=num1*10+num[1]; num1*=10; cnt-=2; for(i=0;i<cnt;i++) num1=num1*10+num[2+i]; } else { for(i=0;i<cnt;i++) num1=num1*10+num[i]; } printf("%d\n",num1-num2); } else//偶数个 { if(n==2)//只有2个 { printf("%d\n",num[1]-num[0]); } else//4个以上 { minsub=min=999999999; for(i=0;i<n-1;i++) if(num[i+1]-num[i]<minsub && num[i]) minsub=num[i+1]-num[i]; for(i=0;i<n-1;i++) if(num[i+1]-num[i]==minsub && num[i])//枚举相邻两位数的差最小的所有情况 { for(j=0;j<10;j++) vis[j]=0; num1=num[i+1]; num2=num[i]; vis[num[i+1]]=vis[num[i]]=1; cnt=n/2-1; for(j=0;cnt>0;j++) { if(!vis[num[j]]) { vis[num[j]]=1; cnt--; num1=num1*10+num[j]; } } cnt=n/2-1; for(j=n-1;cnt>0;j--) { if(!vis[num[j]]) { vis[num[j]]=1; cnt--; num2=num2*10+num[j]; } } if(num1-num2<min) min=num1-num2; } printf("%d\n",min); } } } }
原文:http://blog.csdn.net/faithdmc/article/details/18850517