题意:给几个数,用这些数字组成两个数,求这差值的绝对值最小为多少。
分析:暴力 (next_permutation)直接计算, 这时要注意剪纸不然会超时(两个数开头为零的情况剪掉)。
收获:对于暴力求解剪枝很重要。
#include <iostream>
#include <cstdio>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
using namespace std;
int digit[15];
int n;int Min;
int get_min(int k)
{
while(digit[0]==0)
next_permutation(digit,digit+k);
int mid=(k+1)/2;
do
{
if(digit[mid])
{
int sum1=digit[0],sum2=digit[mid];
for(int i=1; i<mid; i++)
{
sum1=sum1*10+digit[i];
}
for(int i=mid+1; i<k ; i++ )
{
sum2=sum2*10+digit[i];
}
if(abs(sum1-sum2)<Min)
{
Min=abs(sum1-sum2);
}
}
// cout << sum1 << " " << sum2 << " " << abs( sum1 - sum2 ) << endl ;
}
while(next_permutation(digit,digit+k));
return Min;
}
int main ()
{
cin >> n;
getchar ();
char c;
while(n--)
{
Min=10000000;
memset(digit,0,sizeof(digit));
int k=0;
while((c=getchar())!='\n')
{
if(c!=' ')
digit[k++]=c-'0';
}
if(k==1) cout << digit[0]<<endl;
else if(k==2) cout << abs(digit[0]-digit[1]) <<endl;
else
{
cout << get_min(k) <<endl;
}
}
return 0;
}