poj2718 Smallest Difference

来源:互联网 发布:阿里云 企业邮箱 作用 编辑:程序博客网 时间:2024/06/01 09:15

把10个以内的个位数组合成两个数 使差最小

看起来就可以暴力。。

这里用了一个 next_permutation函数

这是一个求一个排序的下一个排列的函数,可以遍历全排列

要注意的是,必须从最小字典序开始,才能所有情况都遍历完



#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#define inf 0x3f3f3f3fusing namespace std;int num[15],l,t,cnt,ans,mid,tmp,s1,s2,i;char s[100];int main(){    scanf("%d",&t);    getchar();    while(t--)    {        gets(s);        l=strlen(s);        cnt=0;        for(i=0;i<l;i+=2)            num[cnt++]=s[i]-'0';        if(cnt==2)        {            printf("%d\n",num[1]-num[0]);            continue;        }        if(cnt==3)        {            if(num[0]==0)                printf("%d\n",num[1]*10-num[2]);            else                printf("%d\n",num[0]*10+num[1]-num[2]);            continue;        }        ans=inf;        while(num[0]==0)            next_permutation(num,num+cnt);        mid=(cnt+1)/2;        if(num[mid])        {            s1=s2=0;            for(i=0;i<mid;i++)                s1=s1*10+num[i];            for(i=mid;i<cnt;i++)                s2=s2*10+num[i];            tmp=abs(s1-s2);            if(tmp<ans) ans=tmp;        }        while(next_permutation(num,num+cnt))        {           /* for(i=0;i<cnt;i++)                printf("%d ",num[i]);            puts("");*/            mid=(cnt+1)/2;            if(num[mid])            {                s1=s2=0;                for(i=0;i<mid;i++)                    s1=s1*10+num[i];                for(i=mid;i<cnt;i++)                    s2=s2*10+num[i];                tmp=abs(s1-s2);                if(tmp<ans) ans=tmp;            }        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击