zoukankan      html  css  js  c++  java
  • 【枚举+贪心】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 }
  • 相关阅读:
    Toolbar设置回退箭头的方法
    Android进程绝杀技--forceStop
    线程池的经典使用
    Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
    adb pull apk
    工厂模式_工厂方法模式
    工厂模式_简单工厂模式
    spring_aop
    代理模式_动态代理
    代理模式_静态代理
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4713802.html
Copyright © 2011-2022 走看看