题目描述:

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

本来这个题是拿来热热身的,谁知道做的时候却被它难住了,主要的问题在于不知道怎么去比较两个数字的大小。开始觉的两个数比较大小时,不止局限于两个数本身,和其他数也有关系,后来发现自己
想错了。 两个数比较,把他们前后拼起来相应比较即可。
开始用的冒泡排序
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> char num[][];
int ci[]; int cmp(int a, int b) {
char at[], bt[];
int lena = strlen(num[a]);
int lenb = strlen(num[b]);
int i = ;
for(int j = ; j < lena; j++) {
at[i++] = num[a][j];
}
for(int j = ; j < lenb; j++) {
at[i++] = num[b][j];
}
at[i] = '\0';
//puts(at);
i = ;
for(int j = ; j < lenb; j++) {
bt[i++] = num[b][j];
}
for(int j = ; j < lena; j++) {
bt[i++] = num[a][j];
}
bt[i] = '\0'; //puts(bt);
return strcmp(at,bt);
} void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main(int argc, char const *argv[])
{
int n;
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%s",num[i]);
ci[i] = i;
}
for(int i = n-; i >= ; i--) {
for(int j = ; j < i; j++) {
if(cmp(ci[j],ci[j+]) > ) {
swap(ci[j], ci[j+]);
}
}
}
for(int i = ; i < n; i++) {
printf("%s",num[ci[i]]);
}
puts("");
}
return ;
}

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

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> char num[][];
int ci[]; int cmp(int a, int b) {
char at[], bt[];
strcpy(at,num[a]);
strcat(at,num[b]); strcpy(bt,num[b]);
strcat(bt,num[a]); //puts(bt);
return strcmp(at,bt);
} void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main(int argc, char const *argv[])
{
int n;
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%s",num[i]);
ci[i] = i;
}
for(int i = n-; i >= ; i--) {
for(int j = ; j < i; j++) {
if(cmp(ci[j],ci[j+]) > ) {
swap(ci[j], ci[j+]);
}
}
}
for(int i = ; i < n; i++) {
printf("%s",num[ci[i]]);
}
puts("");
}
return ;
}

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

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> char num[][];
int ci[]; int cmp(const void *a0, const void *b0) {
int a = *(int*)a0;
int b = *(int *)b0;
char at[], bt[];
int lena = strlen(num[a]);
int lenb = strlen(num[b]);
int i = ;
for(int j = ; j < lena; j++) {
at[i++] = num[a][j];
}
for(int j = ; j < lenb; j++) {
at[i++] = num[b][j];
}
at[i] = '\0';
//puts(at);
i = ;
for(int j = ; j < lenb; j++) {
bt[i++] = num[b][j];
}
for(int j = ; j < lena; j++) {
bt[i++] = num[a][j];
}
bt[i] = '\0'; //puts(bt);
return strcmp(at,bt);
} void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main(int argc, char const *argv[])
{
int n;
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%s",num[i]);
ci[i] = i;
}
qsort(ci, n, sizeof(int), cmp);
for(int i = ; i < n; i++) {
printf("%s",num[ci[i]]);
}
puts("");
}
return ;
}

脑子真是被门挤了

--------------------2016-9-19更新
今天看代码有看不懂了,主要在于比较时,比如32和321,拼起来比较为
32321和32132,这样就解决了数位不一致的问题

九度oj 题目1392:排序生成最小的数的更多相关文章

  1. 九度OJ 1504 把数组排成最小的数【算法】-- 2009年百度面试题

    题目地址:http://ac.jobdu.com/problem.php?pid=1504 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如 ...

  2. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  5. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  7. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  8. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  9. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

随机推荐

  1. 51nod 1525 重组公司

    题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有n个人在公司里面工作.员工从1到n编号.每一个人属于一个部门.刚开始每一个人在自 ...

  2. 2017.10.4 QBXT 模拟赛

    题目链接 T1 维护一个单调栈 #include <iostream> #include <cstdio> #define N 500000 #define rep(a,b,c ...

  3. MyEclipse7.0 M1下载和注册码

    首先介绍下,这款MyEclipse7.0 M1已经内置了Eclipse3.4,所以无需再去下载. 1.下载地址: http://downloads.myeclipseide.com/downloads ...

  4. JAVA小基础

    JAVA的jsp程序中,jar如果不能再引用的时候加入到lib文件夹而选择外部引用,可能会导致jar不能被找到的问题. string.format的占位符一般使用%s表示字符串的意思,与C#的{0}这 ...

  5. jquery绑定事件的系统参数传递方法

    如果是传递的事件自带函数,,可使用以下语法(以鼠标移动事件为例): init: function () { $(document).on("mousemove",loginOper ...

  6. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest J Computer Network1 (缩点+最远点对)

    题意:在连通图中,求一条边使得加入这条边以后的消除的桥尽量多. 在同一个边双连通分量内加边肯定不会消除桥的, 求边双连通分量以后缩点,把桥当成边,实际上是要选一条最长的链. 缩点以后会形成一颗树,一定 ...

  7. git 作成

    Git global setup git config --global user.name "高 文龍" git config --global user.email " ...

  8. 2018.3.4 Linux and Unix 知识点

    UNIX系统的特点 1.多任务 2.多用户 3.强大的网络功能 4.设备无关性 5.并行处理能力 6.开放性 7.错误处理 Linux系统的特点 1.自由软件 2.良好的兼容性 3.良好的界面 4.丰 ...

  9. linux目录结构及文件管理

    Linux的目录结构: /            根分区 linux文件系统的起点 /bin           普通用户的命令,普通用户能使用 /sbin         管理员使用的命令,只有管理 ...

  10. Redis五种数据结构解析

    Redis是一个开源的Key-Value存储引擎,它支持string.hash.list.set和sorted set等多种值类型.由于其卓越的性能表现.丰富的数据类型及稳定性,广泛用于各种需要k/v ...