九度oj 题目1392:排序生成最小的数

题目描述:

还记得陈博是个数字完美主义者么?^_^....这次,他又闹脾气了!我们知道计算机中常常要使用数组保存一组数字,但是今天他就要求把数组里的所有数字组成一个,并且这个数字是这些数字所能组成的所有数字中最小的一个,否则他会抓狂的!!!例如:数组{3,32,321},可以组成6个数字3|32|321, 3|321|32, 32|3|321, 32|321|3, 321|32|3, 321|3|32, 最小的就是321323 (321|32|3).

 

 

 

输入:

输入有多组数据,每组数据包括2行。

第一行包括一个整数n(1<=n<=100),表示数组的大小。接下来一行有n个正整数,每个数都满足[ 1,   1000,000,000 ]。

 

 

 

输出:

 

对应每组数据,输出这个数组所能组成的最小的那个数。

 

 

 

样例输入:
3
32 3 321
5
5 4 3 2 1

样例输出:
321323
12345

本来这个题是拿来热热身的,谁知道做的时候却被它难住了,主要的问题在于不知道怎么去比较两个数字的大小。开始觉的两个数比较大小时,不止局限于两个数本身,和其他数也有关系,后来发现自己
想错了。

两个数比较,把他们前后拼起来相应比较即可。
开始用的冒泡排序
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 char num[102][12];
 7 int ci[102];
 8 
 9 int cmp(int a, int b) {
10     char at[24], bt[24];
11     int lena = strlen(num[a]);
12     int lenb = strlen(num[b]);
13     int i = 0;
14     for(int j = 0; j < lena; j++) {
15         at[i++] = num[a][j];
16     }
17     for(int j = 0; j < lenb; j++) {
18         at[i++] = num[b][j];
19     }
20     at[i] = '\0';
21     //puts(at);
22      i = 0;
23     for(int j = 0; j < lenb; j++) {
24         bt[i++] = num[b][j]; 
25     }
26     for(int j = 0; j < lena; j++) {
27         bt[i++] = num[a][j];
28     }
29     bt[i] = '\0';
30     
31     //puts(bt);
32     return strcmp(at,bt);
33 }
34 
35 void swap(int &a, int &b) {
36     int tmp = a;
37     a = b;
38     b = tmp;
39 }
40 int main(int argc, char const *argv[])
41 {
42     int n;
43     while(scanf("%d",&n) != EOF) {
44         for(int i = 0; i < n; i++) {
45             scanf("%s",num[i]);
46             ci[i] = i;
47         }
48         for(int i = n-1; i >= 1; i--) {
49             for(int j = 0; j < i; j++) {
50                 if(cmp(ci[j],ci[j+1]) > 0) {
51                     swap(ci[j], ci[j+1]);
52                 }
53             }
54         }
55         for(int i = 0; i < n; i++) {
56             printf("%s",num[ci[i]]);
57         }
58         puts("");
59     }
60     return 0;
61 }

调用系统的库函数,速度反而变慢了

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5  
 6 char num[102][12];
 7 int ci[102];
 8  
 9 int cmp(int a, int b) {
10     char at[24], bt[24];
11     strcpy(at,num[a]);
12     strcat(at,num[b]);
13  
14     strcpy(bt,num[b]);
15     strcat(bt,num[a]);
16      
17     //puts(bt);
18     return strcmp(at,bt);
19 }
20  
21 void swap(int &a, int &b) {
22     int tmp = a;
23     a = b;
24     b = tmp;
25 }
26 int main(int argc, char const *argv[])
27 {
28     int n;
29     while(scanf("%d",&n) != EOF) {
30         for(int i = 0; i < n; i++) {
31             scanf("%s",num[i]);
32             ci[i] = i;
33         }
34         for(int i = n-1; i >= 1; i--) {
35             for(int j = 0; j < i; j++) {
36                 if(cmp(ci[j],ci[j+1]) > 0) {
37                     swap(ci[j], ci[j+1]);
38                 }
39             }
40         }
41         for(int i = 0; i < n; i++) {
42             printf("%s",num[ci[i]]);
43         }
44         puts("");
45     }
46     return 0;
47 }

若用快排,速度则有明显提升

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 char num[102][12];
 7 int ci[102];
 8 
 9 int cmp(const void *a0, const void *b0) {
10     int a = *(int*)a0;
11     int b = *(int *)b0;
12     char at[24], bt[24];
13     int lena = strlen(num[a]);
14     int lenb = strlen(num[b]);
15     int i = 0;
16     for(int j = 0; j < lena; j++) {
17         at[i++] = num[a][j];
18     }
19     for(int j = 0; j < lenb; j++) {
20         at[i++] = num[b][j];
21     }
22     at[i] = '\0';
23     //puts(at);
24      i = 0;
25     for(int j = 0; j < lenb; j++) {
26         bt[i++] = num[b][j]; 
27     }
28     for(int j = 0; j < lena; j++) {
29         bt[i++] = num[a][j];
30     }
31     bt[i] = '\0';
32     
33     //puts(bt);
34     return strcmp(at,bt);
35 }
36 
37 void swap(int &a, int &b) {
38     int tmp = a;
39     a = b;
40     b = tmp;
41 }
42 int main(int argc, char const *argv[])
43 {
44     int n;
45     while(scanf("%d",&n) != EOF) {
46         for(int i = 0; i < n; i++) {
47             scanf("%s",num[i]);
48             ci[i] = i;
49         }
50         qsort(ci, n, sizeof(int), cmp);
51         for(int i = 0; i < n; i++) {
52             printf("%s",num[ci[i]]);
53         }
54         puts("");
55     }
56     return 0;
57 }

脑子真是被门挤了

--------------------2016-9-19更新
今天看代码有看不懂了,主要在于比较时,比如32和321,拼起来比较为
32321和32132,这样就解决了数位不一致的问题
posted @ 2016-08-30 09:39  Jason杰  阅读(248)  评论(0编辑  收藏  举报