POJ 2718

题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0)

题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,dfs搜一遍即可。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 const int inf=0x3f3f3f3f;

 6 int a[12],b[12],n,ans;

 7 bool vis[12];

 8 void solve(int aa)

 9 {

10     int len=0;

11     int bb=0;

12     for(int i=0;i<n;i++)

13         if(!vis[i])

14             b[len++]=a[i],bb=bb*10+a[i];

15     if(b[0]!=0||len==1)

16         ans=min(ans,abs(aa-bb));

17     while(next_permutation(b,b+len))

18     {

19         bb=0;

20         for(int i=0;i<len;i++)

21             bb=bb*10+b[i];

22         if(b[0]!=0||len==1)

23             ans=min(ans,abs(aa-bb));

24     }

25 }

26 void dfs(int k,int res)

27 {

28     if(k==n/2)

29     {

30         solve(res);

31         return;

32     }

33     for(int i=0;i<n;i++)

34     {

35         if(!vis[i])

36         {

37             if(a[i]==0&&k==0&&n>3)

38                 continue;

39             vis[i]=true;

40             dfs(k+1,res*10+a[i]);

41             vis[i]=false;

42         }

43     }

44 }

45 int main()

46 {

47     int T;

48     for(scanf("%d ",&T);T;T--)

49     {

50         n=0;

51         char ch;

52         while((ch=getchar())!='\n')

53         {

54             if(ch==' ')

55                 continue;

56             a[n++]=ch-'0';

57         }

58         ans=inf;

59         memset(vis,false,sizeof(vis));

60         dfs(0,0);

61         printf("%d\n",ans);

62     }

63     return 0;

64 }

你可能感兴趣的:(poj)