Smallest Difference POJ 2718(搜索)

Posted vbel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Smallest Difference POJ 2718(搜索)相关的知识,希望对你有一定的参考价值。

原题

题目链接

题目分析

题目要求将一组数组成两个数,注意不能有前导零,要求差绝对值最小, 所以要取两个位数最接近的数来做差,然后搜就完事了.搜法可以用全排列搜,由于只取两个数,就可以直接取前half个数作为一个数,剩下的作为一个数,做差就行了,这样全排列刚好能遍历所有情况.

代码

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <utility>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <cstring>
 7 #include <string>
 8 #include <vector>
 9 #include <stack>
10 #include <queue>
11 #include <map>
12 #include <set> 
13 
14 using namespace std;
15 const int INF=0x3f3f3f3f;
16 
17 int num[20];
18 int ans;
19 
20 void solve(int n)
21 
22     do
23     
24         if(num[0]||n==2||n==3)
25         
26             int mid=n/2;
27             if(num[mid]||n==2)
28             
29                 int x=num[0],y=num[mid];
30                 for(int i=1;i<mid;i++) x=x*10+num[i];
31                 for(int i=mid+1;i<n;i++) y=y*10+num[i];
32                 ans=min(ans,abs(x-y));
33             
34         
35     while(next_permutation(num,num+n));
36 
37 
38 int main()
39 
40 //    freopen("black.in","r",stdin);
41 //    freopen("black.out","w",stdout);
42     int T;
43     cin>>T;
44     getchar();
45     while(T--)
46     
47         ans=INF;
48         char x;
49         int cnt=0;
50         while(~scanf("%c",&x)&&x!=\n) if(x>=0&&x<=9) num[cnt++]=x-0;
51         sort(num,num+cnt);
52         solve(cnt);
53         cout<<ans<<endl;
54     
55     return 0;
56 

 

以上是关于Smallest Difference POJ 2718(搜索)的主要内容,如果未能解决你的问题,请参考以下文章

POJ - 2718Smallest Difference(搜索 )

POJ 2718 Smallest Difference

Smallest Difference POJ 2718(搜索)

poj2718Smallest Difference (穷竭搜索)

(DFS全排列)POJ-2718 Smallest Difference

POJ 2718 Smallest Difference 未AC 《挑战程序设计竞赛》