poj 2718 Smallest Difference

来源:互联网 发布:淘宝一年营业额 编辑:程序博客网 时间:2024/05/21 16:21

题目大意:

告诉你一串数字,0-9十个数字,每个数字最多出现一次。要求把这些数字拼成两个数,使得这两个数的差值最小。输出差值。

思路:

如果数字个数是偶数个,那么就均分。并且第一个数字差值最小。对剩下的数字进行排序,使得第一个数字小的后面尽可能大,第一个数字大的后面尽可能小。

如果数字个数是奇数个,那么对数字进行排序后,数字小的位数多。

注意一点:数字0不能前导。

代码如下:

#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int main(){    char s[55];    int a[15];    int b[15];    int T,n,m,i,j,x,y,ans,k;    scanf("%d",&T);    gets(s);    while(T--)    {        gets(s);        int num=0;        for(i=0;i<strlen(s);i++)        {            if(s[i]>='0'&&s[i]<='9')a[num++]=s[i]-'0';        }        sort(a,a+num);        if(num%2==0)        {            k=num/2;            i=1;            int tem=55,c=1;            if(a[0]==0)i=2;            for(i=i;i<num;i++)            {                if(tem>a[i]-a[i-1])                {                    tem=a[i]-a[i-1];                    c=i;                }                else if(tem==a[i]-a[i-1])                {                    if(abs(c-k)>abs(i-k))c=i;                }            }            x=a[c];y=a[c-1];            j=0;            for(i=0;i<num;i++)            {                if(a[i]==x||a[i]==y)continue;                b[j++]=a[i];            }            k=(num-2)/2;            for(i=0;i<k;i++)                x=x*10+b[i];            for(i=num-3;i>=k;i--)                y=y*10+b[i];            ans=x-y;        }        else        {            if(num==1)ans=a[0];            else            {                k=(num+1)/2;                if(a[0]==0)                {                    x=a[1]*10;                    for(i=2;i<k;i++)                        x=x*10+a[i];                    y=0;                    for(i=num-1;i>=k;i--)                        y=y*10+a[i];                    ans=x-y;                }                else                {                     x=0;                    for(i=0;i<k;i++)                        x=x*10+a[i];                    y=0;                    for(i=num-1;i>=k;i--)                        y=y*10+a[i];                    ans=x-y;                }            }        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击