原题地址:点击打开链接
(原题是英文,下面的是用有道翻译的)
描述
鉴于许多不同的小数位数,你可以通过选择一个非空的子集形成一个整数的位数和写一些秩序。剩下的数字可以写在一些秩序形成第二个整数。除非得到的整数是0,整数可能不会从数字0开始。
例如,如果您有数字0,1,2,4,6和7,您可以编写两个整数10和2467。当然,有很多方法可以形成这样的双整数:210年和764年,204年和176年,等。整数之间的差异的绝对值在过去的28岁,事实证明,没有其他一对由上面的规则可以实现一个更小的差异。
(题意就是说给几个数字(从0到9且不会重复),用这几个数字组成两个数,使他们差的绝对值最小
比如给0,1,2,4,6,7,那么构成204和176差最小,是28,而构成276,140就不是最小的了)
输入
输入的第一行包含病例数。对于每个案例中,都有一行输入包含至少两个但不超过10个小数位数。(小数位数0,1,……9)。没有数字不止一次出现在一行的输入。数字将出现在增加订单,由一个空格隔开。
输出
对于每个测试用例,写在一行两个整数的最小绝对差,可以从给定的数字写如上所描述的规则。
时间限制: 1000 ms
内存限制: 65536 k
Sample Input
1
0 1 2 4 6 7
Sample Out28
#include <iostream>
#include <algorithm>
#include <cctype>
#include <cstdio>
#define MAX_N 10
using namespace std;
int a[MAX_N], n, ans;
int ArrayNum(int l, int r)
{
int num = 0;
for(int i = l; i < r; i ++)
num = num*10 + a[i];
return num;
}
void solve()
{
ans = 1E10;
do{
int m = n / 2;
if(!a[0] && m > 1)
continue;
if(!a[m] && n - m > 1)
continue;
ans = min(ans, abs(ArrayNum(0, m) - ArrayNum(m, n)));
}while(next_permutation(a, a + n));
cout << ans << endl;
}
int main()
{
int M;
cin >> M;
getchar(); //忽略'\n'
while(M --){
char ch;
n = 0;
while((ch = getchar()) != EOF){
if('\n' == ch)
break;
else if(isdigit(ch))
a[n ++] = ch - '0';
}
solve();
}
return 0;
}
Dfs暴力加筛选,因为最多只有10! = 362 8800次,足够用了
这道题之前还以为输入的第一行是数字个数的,结果就WA了很多次。。