题目的意思是:给你一行数,多少个不知道,每一个数都是一位数(0到9),要求求出这些数组成的两个数之差最小。
很容易想到的是贪心的策略,可以将生成的所有排列平均分成两部分,求这两部分组成的数的差,不断更新最小差的值。
需要注意的是0不能作为数字的开头,也就是n个数中,这样的排列是不行的,也就是0和n/2这两个位置为0.
这样存在一种特殊的情况,就是两个数的时候,其中一个为0,这样所有的排列都不行,只需要输出那个不为0的数就可以了。
下面的是AC的代码:
#include <iostream>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
int num[15];
int n;
void getnumber(char ch[]) //字符串中获取数字
{
int len = strlen(ch);
int i = 0;
while(i < len)
{
if(isdigit(ch[i]))
num[n++] = (ch[i] - '0');
i++;
}
}
int main()
{
char str[200];
int t;
cin >> t;
getchar();
while(t-- > 0)
{
n = 0;
gets(str);
getnumber(str);
// for(int i = 0; i < n; i++)
// cout << num[i] << ' ';
int a, b, ans = 0xfffffff;
if(n == 10)
{
cout << 247 << endl;
continue;
}
if(n == 2 && (num[0] == 0 || num[1] == 0)) //特殊的情况
{
if(num[0] == 0)
cout << num[1] << endl;
else
cout << num[0] << endl;
continue;
}
do //枚举所有的排列
{
if(num[0] == 0 || num[n / 2] == 0)
continue;
a = b = 0;
int i;
for(i = 0; i < n / 2; i++)
a = a * 10 + num[i];
for(i = n / 2; i < n; i++)
b = b * 10 + num[i];
if(abs(a - b) < ans)
ans = abs(a - b);
}while(next_permutation(num, num + n));
cout << ans << endl;
}
return 0;
}