zoukankan      html  css  js  c++  java
  • 九度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] = '';
    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] = '';
    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] = '';
    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] = '';
    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,这样就解决了数位不一致的问题
  • 相关阅读:
    rosservice call ERROR:Unable to load type ... Have you typed 'make'
    查看ubuntu版本号
    VirtualBox虚拟机 host/guest 拷贝粘贴,共享剪贴板,安装guest additions
    traffic_light_bag_file 数据集 下载链接
    ubuntu linux double tab
    ubuntu linux查看cpu信息
    ubuntu linux查看硬盘使用量
    ubuntu查看nvidia显卡状态
    ibus
    windows7 屏幕亮图胡乱变化
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5820632.html
Copyright © 2011-2022 走看看