题目链接:点击打开链接
题意:有一列数,对其任意分成两组,每组按一定顺序可以组成一个数。
问得到的两个数的差最小是多少。
要想两个数的差最小,就是对半分,暴力比较求最小值。
关键就是用next_permutation()函数求这列数的全排列,排除前导零的情况。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define INF 0x3f3f3f3f using namespace std; int a[15]; int n; void solve() { while(a[0]==0) next_permutation(a,a+n); int ans=INF; int mid=(n+1)/2; do { if(a[mid]) { int x=a[0],y=a[mid]; for(int i=1;i<mid;i++) x=x*10+a[i]; for(int i=mid+1;i<n;i++) y=y*10+a[i]; if(ans>abs(x-y)) ans=abs(x-y); } }while(next_permutation(a,a+n)); cout<<ans<<endl; } int main() { int T; char c; scanf("%d",&T); getchar(); while(T--) { n=0; memset(a,0,sizeof(a)); while((c=getchar())!=' ') { if(c!=' ') a[n++]=c-'0'; } if(n==1) printf("%d ",a[0]); else if(n==2) printf("%d ",abs(a[1]-a[0])); else solve(); } return 0; }