POJ - 2718
DFS 子集枚举 全排列枚举 next_permutation
给你一串不重复的数字,要你分成两部分,让这两部分的值的差尽可能的小。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main() {
int t,k,a[10],num1,num2,ans;
char c;
scanf("%d",&t);
getchar();
while(t --) {
k = 0;
ans = 1 << 30;
while(scanf("%c",&c)) {// 这种读入方式真香
if(c == ' ') continue;
if(c == '
') break;
a[k ++] = c - '0';
}
if(k == 2) {// 特判两个数字的情况就行了。
printf("%d
",abs(a[0] - a[1]));
continue;
}
while(next_permutation(a,a + k)) {
if(a[0] == 0 || a[k / 2] == 0) continue;
num1 = num2 = 0;
for(int i = 0;i < k/2; ++i) num1 = num1 * 10 + a[i];
for(int i = k/2;i < k; ++i) num2 = num2 * 10 + a[i];
ans = min(ans,abs(num1 - num2));
}
printf("%d
",ans);
}
return 0;
}
参考