九度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 ...
随机推荐
- 【Python图像特征的音乐序列生成】关于音乐生成的思路转变
在前几天的讨论会上,有师兄指出原来的方法实在是很难训练,所以我改进了音乐生成的思路. 首先,我用LSTM生成的一定是一段音乐的序列化表达,那么我就可以用成型的一些数据集去训练LSTM.为了避免生成的音 ...
- 检查EXE、DLL、SYS等文件是32位还是64位的
非.NET文件用:dumpbin.exe /headers file.exe(C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin) . ...
- 关于JavaScript的变量和函数提升
第一种理解方式:let和const不能被使用,直到他们被声明 对于var定义的变量,解析器会提升其到作用域顶部. // Outputs: undefined console.log(x); var x ...
- coredata 删除与更新
http://blog.csdn.net/rhljiayou/article/details/18037729 //删除 -(void)deleteData { NSManagedObjectCont ...
- 删除Chrome地址栏记录中自动补全的网址
为了删除某个自动补全的网站,多年的历史纪录没了,还浪费我十多分钟,蠢哭_(:з」∠)_ 不是历史记录.不是清除浏览器数据.不是myactivity(谷歌账号)中的历史纪录,直接在书签中搜索,删除,OK ...
- Python3之偏函数
通过设定参数的默认值,可以降低函数调用的难度.偏函数可以做到这一点 int()函数可以把字符串转换成十进制整数,当传入字符串时,int()默认把字符串为十进制 >>> int('12 ...
- targetcli save error
iscsi configuration unable to save python error “ValueError: 'Implict and Explict' is not in list” / ...
- vue 报错unknown custom element解决方法
原因: 没有引入相关组件导致的 解决办法: 如果组件是按需引入的必须引入你当前用到的组件,否则会报错
- cocos2d-x的基本动作2
1.基本动作 Cocos2d提供的基本动作:瞬时动作.延时动作.运作速度. 瞬时动作:就是不需要时间,马上就完成的动作.瞬时动作的共同基类是 InstantAction. Cocos2d提供以下瞬时动 ...
- SVN:The working copy is locked due to a previous error (一)
使用 Cornerstone 时,碰到如题问题,SVN无法Update.Commit等操作. 解决办法:Working Copies ⟹ '右键' ⟹ Clean 即可解决! 尊重作者劳动成果,转载 ...