九度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 ...
随机推荐
- SAP云平台的Document Service
SAP云平台以微服务的方式提供了Document的CRUD(增删改查)操作.该微服务基于标准的CMIS协议(Content Management Interoperability Service). ...
- VS开发软winform软件的更改用户使用权限
在使用软件的过程中,我们经常需要使用的软件拥有管理员权限,在开发的过程中,本人就遇到了应为权限不足的问题导致软件不能正常使用的状况. 在此我来记录我遇到的问题. 为开发的软件赋予管理员权限 https ...
- 报bug
在打印输出seg的gt数据的时候,出现了gt数据突然很大突然很小的情况,一般这种都是访问了其他内存
- iOS或Mac开发者应该记住的前缀
- 【转】Qt Socket简单通信
最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...
- 【线段树 树链剖分 差分 经典技巧】loj#3046. 「ZJOI2019」语言【未完】
还是来致敬一下那过往吧 题目分析 先丢代码 #include<bits/stdc++.h> ; ; ; struct node { int top,son,fa,tot; }a[maxn] ...
- tomcat关闭钩子
转 http://501565246-qq-com.iteye.com/blog/1733575 21,tomcat关闭钩子 博客分类: tomcat 在很多环境下,在关闭应用程序的时候需要做一些 ...
- sphinx中文入门指南 (转自sphinx中文站)
Sphinx中文入门指南 wuhuiming<blvming在gmail.com>,转载请注明来源和作者 最后修改:2010年1月23日 1.简介 1.1.Sphinx是什么 1.2.Sp ...
- k8s基于canel的网络策略
Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kube ...
- Leetcode5078. 负二进制数相加
问题: 5078. 负二进制数相加 给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果. 数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列. ...