差值
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值。例如输入数组{1, 2},则输出9。
-
输入
- 第一行输入一个整数T,表示有T组测试数据。每组测试数据的第一行输入一个整数n(0<n<=1000),第二行输入n个整数ai(0<=ai<2^32)。 输出
- 输出最大数最小数的差值,输出占一行。 样例输入
-
1 3 1 2 3
样例输出
-
198
上传者
-
ZWZ530
思路:
这个题目比较有意思,不是纯粹的模板题,夙瑶需要对输入进行数据处理。难点为排序算法,应该清楚不是数值大的排前面而是字典序最大的排前 ,这里可以用到strcmp()进行比较,排完序进行一个简单的大数减法操作就行了,不推荐用模板,因为这两个相减的数数位相同,大小关系已知,很简单的操作。最后注意处理前导零就行了。
编程最重要的还是细心。
#include<bits/stdc++.h> using namespace std; char c[50001]; char s[50001]; int n; struct zz { char s[50]; }q[1050]; int cmp(zz a,zz b)//字典序进行排序 { return strcmp(strcat(a.s,b.s),strcat(b.s,a.s))<0; } int main() { int t; scanf("%d",&t); while(t--) { memset(q,0,sizeof(q)); memset(s,0,sizeof(s)); memset(c,0,sizeof(c)); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",q[i].s); } sort(q,q+n,cmp); int z=0,p=0; for(int i=0,j=n-1;i<n&&j>=0;j--,i++) { strcat(c,q[i].s);//最小 strcat(s,q[j].s);//最大 } int l=strlen(c); for(int i=l-1;i>=0;i--) { if(s[i]-c[i]<0) { --s[i-1]; s[i]+=10; } s[i]=s[i]-c[i]+'0'; } int y=0; for(;y<l;y++) { if(s[y]!='0'){puts(s+y);break;} } if(y==l) printf("0\n"); } return 0; }