#include<cstdio> #include<cstdlib> #include<string.h> #include<cmath> int n,m,ans; int a[10]; int j,i,t; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int change(int x,int y) { x*=10; return (y+x); } int main() { int first,second; freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); scanf("%d",&m); for (t=1;t<=m;t++) { memset(a,0,sizeof(a)); first=0; second=0; scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&a[i]); qsort(a,n+1,sizeof(int),cmp); if (n & 1==1) { if (a[1]) { for (j=1;j<=(n/2+1);j++) {first=change(first,a[j]);} } else { first=change(first,a[2]); first=change(first,0); for (j=3;j<=(n/2+1);j++) {first=change(first,a[j]);} } for (j=n;j>=n/2+2;j--) {second=change(second,a[j]);} ans=first-second; printf("%d\n",ans); } else if (n==2) {printf("%d\n",a[2]-a[1]);} else { int cha,num,j,dd; cha=9; for (j=1;j<n;j++) { if ((a[j+1]-a[j]<cha)&&(a[j]!=0)) { cha=a[j+1]-a[j]; num=j; dd=abs(n/2-j); } else { if (a[j+1]-a[j]==cha) if (abs(n/2-j)<dd) {num=j;dd=abs(n/2-j);} } } first=change(first,a[num]); second=change(second,a[num+1]); int temp=0; for (j=n;j>1;j--) { if ((j!=num)&&(j!=num+1)) { first=change(first,a[j]); temp++; } if (temp==(n-2)/2) break; } temp=0; for (j=1;j<n;j++) { if ((j!=num)&&(j!=num+1)) { second=change(second,a[j]); temp++; } if (temp==(n-2)/2) break; } ans=second-first; printf("%d\n",ans); } } return 0; }
给定一些不同的一位数字,你可以从这些数字中选择若干个,并将它们按一定顺序排列,组成一个整数,把剩下的数字按一定顺序排列,组成另一个整数。组成的整数不能以0开头(除非这个整数只有1位)。
例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。
给定N个不同的0~9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少?