题意:
给一串大于0且小于9的数字,将其分成两串数字且差值最小。长度大于0的数字不能以0开始。
题解
两个子串长度相同或相差1时它们的差值最小。使用next_permutation生成全排列后,用前一半的数字减后一半的数字取绝对值。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1000
#define INF 1000000000
using namespace std;
char digit[MAXN];
int solve()
{
int res=INF;
int len=strlen(digit);
if(len==1)
return digit[0]-'0';
do
{
int mid=len / 2;
int left = 0;
int right = 0;
if((digit[0] == '0' && mid > 1) ||
(digit[mid] == '0' && len-mid > 1))
continue;
for(int i = 0; i < mid; i++)
left = left * 10 + (digit[i] - '0');
for(int i = mid; i < len; i++)
right = right * 10 + (digit[i] - '0') ;
//cout<<"right:"<<right<<"\t"<<"left:"<<left<<endl;
int temp = right - left;
if(temp < 0)
temp = -temp;
if(temp < res)
{
res=temp;
}
}while(next_permutation(digit,digit+len));
return res;
}
int main()
{
int n;
cin>>n;
getchar();
while(n--)
{
char temp[MAXN];
gets(temp);
int j = 0;
for(int i=0; i < strlen(temp); i+=2,j++)
digit[j]=temp[i];
digit[j]='\0';
sort(digit, digit + strlen(digit));
int res = solve();
cout<<res<<endl;
}
return 0;
}