【题目大意】
按升序输出几个不同的数字,任意组成两个数字,输出最小的差值。
【思路】
虽然是在穷竭搜索的章节里找到的题目,但是我觉得不需要穷竭搜索,枚举一下就可以了,0MS。分为一下三种情况:
(1)如果只有两个数字,且其中第一个数字为0,则第二个数字就是答案。
(2)如果有奇数个数字,分为长度为l+1和l的两部分,则较大数为从小到大的l+1个数字,较小数为从大到小的l个数字。如果首位是0,就和第二个数字预先交换位置。
(3)如果有偶数个数字,则两个数字长度必定一致。枚举两个数的首位数字,较大数在余下数字汇总由小到大取,较小数由大到小取即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 const int MAXN=20+5; 6 using namespace std; 7 char s[MAXN]; 8 int digit[MAXN]; 9 int leng; 10 11 int per() 12 { 13 int num1,num2; 14 int ans=0x7fffffff; 15 for (int i=0;i<leng;i++) 16 for (int j=i+1;j<=leng;j++) 17 { 18 if (digit[i]==0 || digit[j]==0) continue; 19 num1=digit[j],num2=digit[i]; 20 21 int t=0,p=-1; 22 while (t<leng/2) 23 { 24 p++; 25 if (p==i || p==j) continue; 26 t++; 27 num1=num1*10+digit[p]; 28 } 29 30 t=0,p=leng+1; 31 while (t<leng/2) 32 { 33 p--; 34 if (p==j || p==i) continue; 35 t++; 36 num2=num2*10+digit[p]; 37 } 38 if (num1-num2<ans) ans=num1-num2; 39 } 40 return (ans); 41 } 42 43 int odd() 44 { 45 int num1=0,num2=0; 46 if (digit[0]==0) swap(digit[0],digit[1]); 47 for (int i=0;i<=leng/2;i++) num1=num1*10+digit[i]; 48 for (int i=leng;i>leng/2;i--) num2=num2*10+digit[i]; 49 return (num1-num2); 50 } 51 52 int main() 53 { 54 int kase; 55 scanf("%d",&kase); 56 getchar(); 57 for (int cases=0;cases<kase;cases++) 58 { 59 gets(s); 60 leng=-1; 61 for (int i=0;i<strlen(s);i+=2) 62 { 63 leng++; 64 digit[leng]=s[i]-'0'; 65 } 66 67 if (leng==1 && digit[0]==0) cout<<digit[1]<<endl; 68 else 69 { 70 if ((leng+1)%2==1) cout<<odd()<<endl; 71 else cout<<per()<<endl; 72 } 73 } 74 75 return 0; 76 }