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 }
方法二:
用排列来做,把输入的一行数存在一个数组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 }
浙公网安备 33010602011771号