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