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(搜索 )
Smallest Difference POJ 2718(搜索)
poj2718Smallest Difference (穷竭搜索)