Smallest Difference
题 意:给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数。剩余元素可以用相同规则构建第二个数。除非构造的数恰好为0,否则不能以0打头。
举例来说,给定数字0,1,2,4,6与7,你可以写出10和2467。当然写法多样:210和764,204和176,等等。最后一对数差的绝对值为28,实际上没有其他对拥有更小的差。
数据范围: 不超过10个二进制数
输入样例:
1
0 1 2 4 6 7
输出样例:
28
思 路:肯定是从num/2分开他们的差会最小,用next_permutation。全排列
//
// Created by luozujian on 17-10-24.
//
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
int a[10];
int num ;
void solve()
{
sort(a,a+num);
if(num == 2)
{
printf("%d\n",abs(a[num/2]-a[num/2-1]));
return ;
}
int ans = INF;
do{
int num1 = 0,num2 = 0;
if(a[0] == 0 || a[num/2] == 0 || num<=2)
{
continue;
}
for(int i=0;i<num/2;i++)
{
num1 = num1*10+a[i];
}
for(int i=num/2;i<num;i++)
{
num2 = num2*10+a[i];
}
ans = min(ans,abs(num1-num2));
}while(next_permutation(a,a+num));
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
num = 0;
char ch;
while((ch = getchar())!='\n')
{
if(ch>='0' && ch<='9')
{
int number = (int) ch - '0';
a[num++] = (int) ch - '0';
}
}
solve();
}
return 0;
}