POJ-2718 Smallest Difference

http://poj.org/problem?id=2718

从一些数里面选择一个子集组成一个数,余下的数组成另外一个数,(数不能以0开头)问两个数的差的绝对值最小是多少!

不管是奇数还是偶数,要想绝对值最小,那么两个数的位数就要尽量接近,所以每一个数的位数都是n/2,枚举这些数的全排列,然后去找这个最小值。

注意的是直接枚举会超时,需要剪枝。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 #include <map>
15 #include <queue>
16 
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18 
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24 
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d\n", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("b.txt", "w", stdout);
36 #define maxn 1000000000
37 #define N 1010
38 using namespace std;
39 
40 int main()
41 {
42    //Read();
43    //Write()
44    int t;
45    int f[15],n,minn;
46    string s;
47    scanf("%d",&t);
48    getchar();
49    while(t--)
50    {
51        getline(cin,s);
52        n=0;
53        for(int i=0;i<s.length();i++)
54        {
55            if(s[i]>='0'&&s[i]<='9') f[n++]=s[i]-'0';
56        }
57       // printf("%d\n",n);
58       // for(int i=0;i<n;i++) printf("%d ",f[i]);
59        if(n==2) {printf("%d\n",abs(f[0]-f[1]));continue;}
60        minn=maxn;
61        while(f[0]==0) next_permutation(f,f+n);  //剪枝
62        do
63        {
64            if(f[n/2])   //剪枝
65            {
66                int x=0,y=0;
67                for(int i=0;i<n/2;i++) x=x*10+f[i];
68                for(int i=n/2;i<n;i++) y=y*10+f[i];
69                minn=min(abs(x-y),minn);
70            }
71        }while(next_permutation(f,f+n));
72        printf("%d\n",minn);
73    }
74    return 0;
75 }

 

posted @ 2015-04-08 09:50  NowAndForever  阅读(226)  评论(0编辑  收藏  举报