九度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
本来这个题是拿来热热身的,谁知道做的时候却被它难住了,主要的问题在于不知道怎么去比较两个数字的大小。开始觉的两个数比较大小时,不止局限于两个数本身,和其他数也有关系,后来发现自己
想错了。 两个数比较,把他们前后拼起来相应比较即可。
开始用的冒泡排序#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:排序生成最小的数的更多相关文章
- 九度OJ 1504 把数组排成最小的数【算法】-- 2009年百度面试题
题目地址:http://ac.jobdu.com/problem.php?pid=1504 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
随机推荐
- Python3基础02(列表和字符串处理)
str = 'Runoob'# 输出字符串print(str) # 输出第一个到倒数第二个的所有字符print(str[0:-1]) # 输出字符串第一个字符print(str[0]) # 输出从第三 ...
- JavaScript_2_实现
1. HTML中的脚本必须位于<script>与</script>标签之间 JavaScript是所有现代浏览器以及HTML5中的默认脚本语言 2. 脚本可被放置在HTML页面 ...
- vijos 1320 清点人数
背景 NK中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去.由于NK中学的学生很多,在火车开之前必须清点好人数. 描述 初始时,火车上没有学生:当同学们开始上火车时,年级主任从第一节车厢出 ...
- SAP ERP和C4C Account和Contact的双向同步
Account和Contact是C4C里唯一支持可以和ERP进行双向同步的主数据类别. C4C里创建一个Account:Mouser Electronics 在C4C里保存Account,自动同步到E ...
- itextsharp-5.2.1-修正无法签名大文件问题
PDF文件格式几乎是所有开发平台或者业务系统都热爱的一种文档格式. 目前有很多优秀的开源PDF组件和类库.主要平时是使用.NET和Java开发,所以比较偏好使用iText,当然,它本身就很强大.iTe ...
- UVALive 4794 Sharing Chocolate(状压,枚举子集)
n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割. 预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的 ...
- UVA12904 Load Balancing(中途相遇法)
虽然这题可以用暴力n^3过,但是还有有种n^2的方法的,枚举b,对于b,分别枚举a和c,得到对于这个b的最优解,然后从所以b中选一个最优的. 要保证字典序最小,只要从小往大枚举就好了 感谢moonfl ...
- HTTP、HTTP2.0、HTTPS、SPDY
本文原链接:https://cloud.tencent.com/developer/article/1082516 HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事 1.web始祖HT ...
- MFC多文档无法显示可停靠窗格
当我们使用MFC多文档创建项目时,我们可停靠窗格关闭之后就无法显示了.即使重新编译项目也无法再次显示它们. 原因:因为MFC多文档把这些设置存储在注册表 “HKEY_CURRENT_USER \ SO ...
- Hibernate中session的save方法问题
今天在使用session.save(),进行插入数据操作时,一直没有成功,也没有报错.后来发现是因为没有创建事务,提交事务的原因 你对flush和commit的意思没有理解到:1,flush代表刷新, ...