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,这样就解决了数位不一致的问题
  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5820632.html
Copyright © 2011-2022 走看看