/*
translation:
给出一组数,用这一组数字的两个不相交的子集组成两个数。求两个数差的绝对值的最小值。
solution:
生成所有可能的子集
可以用库函数,也可以用bitset写。这里直接用next_permutation生成所有的可能排列
再从中间切割,用前后两个数相减的值依次更新ans值即可。
note:
1:本来想用dfs生成所有的可能解,但还是库函数好用。
date:
2016.10.21
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 10 + 5;
const int INF = 1e8;
int digit[maxn], num1[maxn], num2[maxn];
int ans, used[maxn], p;
int solve()
{
while(digit[0] == 0) next_permutation(digit, digit+p);
int mid = (p+1) / 2;
do
{
if(digit[mid])
{
int a = digit[0], b = digit[mid];
for(int i = 1; i < mid; i++) a = a*10 + digit[i];
for(int i = mid + 1; i < p; i++) b = b*10 + digit[i];
ans = min(ans, abs(a-b));
}
} while(next_permutation(digit, digit+p));
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
getchar();
while(T--)
{
char ch; p = 0;
memset(digit, 0, sizeof(digit));
while((ch=getchar())!='\n')
{
if(ch==' ') continue;
digit[p++]=ch-'0';
}
ans = INF; //printf("#%d\n", p);
if(p == 1) printf("%d\n", digit[0]);
else if(p == 2) printf("%d\n", abs(digit[0] - digit[1]));
else printf("%d\n", solve());
}
return 0;
}
poj2718(子集生成)
最新推荐文章于 2021-05-06 21:45:31 发布