把10个以内的个位数组合成两个数 使差最小
看起来就可以暴力。。
这里用了一个 next_permutation函数
这是一个求一个排序的下一个排列的函数,可以遍历全排列
要注意的是,必须从最小字典序开始,才能所有情况都遍历完
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
using 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;
}