九度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 ...
随机推荐
- POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)
题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬 ...
- python基础教程总结4—基本语句
一.print 和 import 的更多信息 print 打印多个表达式也是可行的,只要将它们用逗号隔开就好: >>> print('Age:' , 42) Age: 42 可以看到 ...
- Ubuntu下安装XAMPP
来源:http://www.ido321.com/1265.html 最近,我也玩起了Linux了,瞬间觉得自己逼格又上去了,所以,就给笔记本安装了Ubuntu+Win7双系统.当然在Ubuntu下必 ...
- 【UML】状态图Statechart diagram(转)
前言 UML由动态图和静态图组成,状态图就是属于动态图中较为重要的一张图. 定义 用来描述一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转移. 目的 ...
- Java 集合框架_中
Set接口 特点: [1]Set接口表示一个唯一.无序的容器(和添加顺序无关) Set接口常用实现类有 HashSet [1]HashSet是Set接口的实现类,底层数据结构是哈希表. [2]Hash ...
- Django ORM models操作
title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...
- Java中this关键字的用法
this关键字作用: 1. 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据. 2. 在一个构造函数中可以调用另外一个构造函数初始化对 ...
- python-IE浏览器调用
IE浏览器驱动添加 selenium官网有提供下载http://code.google.com/p/selenium/downloads/list 这里我用的是IEDriverServer_Win32 ...
- jqury点击返回顶部代码
效果请看右下角:代码如下: <div class="totop"><img src="https://www.cnblogs.com/images/cn ...
- webgis技术在智慧城市综合治理网格化社会管理平台(综治平台)的应用
网格化社会管理平台功能:1 实有人口管理人口数据管理按照人口分类进行管理,分为常住人口.流动人口.特殊人群.弱势群体,功能包括人口信息管理.归口负责.人房关联.统计汇总.地图监管服务等功能.人口信 ...