标签:
(原题是英文,下面的是用有道翻译的)
描述
鉴于许多不同的小数位数,你可以通过选择一个非空的子集形成一个整数的位数和写一些秩序。剩下的数字可以写在一些秩序形成第二个整数。除非得到的整数是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了很多次。。
POJ 2718:Smallest Difference(dfs)
标签:
原文地址:http://blog.csdn.net/luoluozlb/article/details/51336975