【枚举+贪心】POJ2718-Smallest Difference

【题目大意】

按升序输出几个不同的数字,任意组成两个数字,输出最小的差值。

【思路】

虽然是在穷竭搜索的章节里找到的题目,但是我觉得不需要穷竭搜索,枚举一下就可以了,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 }
原文地址:https://www.cnblogs.com/iiyiyi/p/4713802.html