POJ 2718 Smallest Difference(穷竭搜索)

此题输入有点坑!

 

方法一:(dfs)

   此题暴力可以水过,不过得选c++,g++不给过,

   还有就是注意一下首个数字不能为零的问题:

 代码:

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cmath>
 7 using namespace std;
 8  
 9 int ma[10];int ans1;int num;
10 int vis[10];
11 int ans[10];
12  
13 void dfs(int deep)//参数分别为第一个数为n位数,一共有num个数,当前是deep位
14 {
15     if(deep>num){
16  
17             int num1=0,num2=0;
18         for(int i=0;i<num/2;i++)
19         {
20             num1=num1*10+ans[i];
21         }
22         for(int i=num/2;i<num;i++)
23             num2=num2*10+ans[i];
24         ans1=min(ans1,abs(num1-num2));
25   
26         return ;
27     }
28     for(int i=0;i<num;i++)
29     {
30         if(vis[i])continue;
31         if(num/2>1&&deep==1&&ma[i]==0)continue;
32         if(num/2<num-1&&deep==num/2+1&&ma[i]==0)continue;
33         vis[i]=1;ans[deep-1]=ma[i];
34         dfs(deep+1);
35         vis[i]=0;
36     }
37 }
38  
39 int main()
40 {
41     int t;
42     scanf("%d",&t);
43     getchar();
44     while(t--)
45     {
46         memset(vis,0,sizeof(vis));
47         char ch;num=0;ans1=99999999;
48  
49         while((ch=getchar())!='\n')
50         {
51             if(ch==' ')continue;
52             ma[num++]=ch-'0';
53         }
54             dfs(1);
55         cout<<ans1<<endl;
56  
57     }
58 }
View Code

 

方法二:

   用排列来做,把输入的一行数存在一个数组arr里,枚举所有的排列,对每个排列求arr[0,(num/2)]-arr[(num/2),num]的绝对值,记录下最小的结果就是一个解。

   num表示:输入了多少个数。

   arr[i,j]表示arr[i],arr[i+1],...  ,arr[j-1]组成的十进制数(前闭后开),arr[i]表示最高位,例:如果arr[1]=1 arr[2]=3 arr[3]=5 这arr[1,3]表示13这个数,arr[1,4]表示135。

代码如下:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<string.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 int t;
 9 int arr[10];
10 
11 int get(int l,int r){ //获取arr数组中下标为l到r组成的数,前闭后开
12     int temp = 0;
13     for(int i=l;i<r;i++){
14         temp = temp*10+arr[i];
15     }
16     return temp;
17 }
18 
19 void solve(){
20     int ans;
21     int num;  //记录每次输入了多少个数
22     scanf("%d",&t);
23     for(int i=0;i<t;i++){  //进行t次输入
24         ans=0x3f3f3f3f;
25         num=0;
26         char c;
27         for(int j=0;j<10;j++){
28             scanf("%d%c",&arr[j],&c);
29             num++;
30             if(c=='\n') break;
31         }
32         int halfNum = num/2;
33         if(num==2) { printf("%d\n",abs(arr[0]-arr[1]));continue;} // 0 othernum 的情况
34         /*if(arr[0]!=0){
35             ans = min(ans,abs(get(0,halfNum)-get(halfNum,num)));
36             //初始状态永远不可能为最小的状态可以不用考虑
37         }*/
38         while(next_permutation(arr,arr+num)){ //生成下一个排列
39             if(arr[0]!=0&&arr[halfNum]!=0){
40                 ans = min(ans,abs(get(0,halfNum)-get(halfNum,num)));
41             }
42         }
43         printf("%d\n",ans);
44     }
45 }
46 
47 int main(){
48     solve();
49     return 0;
50 }
View Code

 

posted @ 2019-11-12 21:12  xiongbing  阅读(92)  评论(0)    收藏  举报