poj 2718
首先可以想到,这两个数必定是用各一半数量的数字组成的数,如给出6个数,把这6个数分为两组,每组3个,这样组成的数字的差必定比其他方式小。接下来的任务就是穷举所有可能出现的组合,并求出最小差。在这里可以使用STL的next_permutation函数来求给定这组数字的所有排列,并将其分为两组组成数字,然后记录最小差。需要注意第一个数位不能为0。
#include <iostream> #include <algorithm> using namespace std; const int INF = 100000000; int n, i, ids, a[15]; int num(int i, int j) { int x = 0; for(int k=i; k<j; k++) { x *= 10; x += a[k]; } return x; } void solve() { int ans = INF; int k = ids / 2; do { if(a[0] == 0 || a[k] == 0) continue; int x = num(0, k); int y = num(k, ids); ans = min(ans, abs(x - y)); } while(next_permutation(a, a+ids)); if(ids == 2) ans = abs(a[0] - a[1]); cout << ans << endl; } int main() { scanf("%d", &n); for(getchar(); i<n; i++) { char c; ids = 0; while((c=getchar()) != '\n') if(c != ' ') a[ids++] = c - '0'; solve(); } return 0; }