趣味算法------拼数

题目描述

设有 n 个正整数 a 1...a n ,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式
第一行有一个整数,表示数字个数 n。

第二行有 n 个整数,表示给出的 n 个整数 a i。

输出格式
一个正整数,表示最大的整数。

输入输出样例
输入 1

3
13 312 343
输出 1
34331213

输入 2
4
7 13 4 246
输出 2
7424613
输入第一行表示输入数字个数为 3,第二行再给出 3 个整数;首先将 3 个整数进行首尾相接,一个整数位置不变的情况下,将其他整数进行连接组成最大的整数。例如输出 34331213:343 为其中数字最大的值,其次时 312,最后接上 13 即可得出最大整数。

思路解析:

简单来说这道题目的就是将n个数组合拼接求出组合的最大值。这道题有许多不同的方法,比图第一个是暴力求解,也就是将所有的可能都枚举出来,然后一个一个比较,第二是使用深度优先搜索来解决,但是当数据太多时,这两种浪费的时间太多,所以我们需要另一种方法。

假如数据只有7,12时呢?有712和127来比较,如果有7,12,13呢?我们先比较前两个数字,712,127,发现712大,7和12不需要交换位置,然后比较12,13,发现1213<1312,需要交换位置变为7,13,12,最后组合就是71312。

现在按照这个思路我给大家出一组数据。(请在草稿纸上演练)

7,12,13,42,56,53,31。

有没有发现比较熟悉。。。。。。。

这就是我们在早期说过的冒泡排序,可以在往期文章中了解,只不过交换位置判定条件从两个数字之间的大小变成两个数字组合方案的最大值决定。

具体代码:

#include<stdio.h>

#include<math.h>

int fun(int n)

{

int count = 0;

while (n)

{

count++;

n /= 10;

}

return count;

}//求数字的位数。

int check(int n, int m)

{

int count1 = n * pow(10, fun(m)) + m;//count1的值是nm组合

int count2 = m * pow(10, fun(n)) + n;//count2的值是mn组合

if (count1 > count2)

return 1;

return 0;

}

int main(void)

{

int n;

int arr[100] = { 0 };

scanf("%d", &n);

for (int i = 0; i < n; i++)

scanf("%d", &arr[i]);//数据输入。

for(int i = 0;i<n;i++)

for (int j = 0; j < n - i - 1; j++)

if (check(arr[j+1], arr[j]))

{

int t = arr[j + 1];

arr[j + 1] = arr[j];

arr[j] = t;

}//"冒泡"排序

for (int i = 0; i < n; i++)

printf("%d", arr[i]);//按顺序逐个打印。

}

注意:

pow()函数"属于"math.h,传入两个参数,比如pow(n,m)的返回值是n的m次幂,但是要注意返回值非整型。

我们为什么最后不直接打印一个整数呢(组合),而是要按数组顺序打印?这是因为在正常情况下刷题和比赛网站判断正确与否是看显示屏上输出的内容和答案是不是一样,换而言之,

答案打印1213和依次打印1,2,1,3没有什么区别。

实际上我们判断数字需不需要交换还可以看两个相同位上的数字,比如7,17。7显然比1大,所以直接是717,但是逐位判断时间复杂度还会增加,不过当数据量太多时相比起优先搜索和暴力枚举还是很快的。

相关推荐
带多刺的玫瑰2 分钟前
Leecode刷题C语言之切蛋糕的最小总开销①
java·数据结构·算法
巫师不要去魔法部乱说13 分钟前
PyCharm专项训练5 最短路径算法
python·算法·pycharm
qystca44 分钟前
洛谷 P11242 碧树 C语言
数据结构·算法
冠位观测者1 小时前
【Leetcode 热题 100】124. 二叉树中的最大路径和
数据结构·算法·leetcode
XWXnb61 小时前
数据结构:链表
数据结构·链表
悲伤小伞1 小时前
C++_数据结构_详解二叉搜索树
c语言·数据结构·c++·笔记·算法
m0_675988232 小时前
Leetcode3218. 切蛋糕的最小总开销 I
c++·算法·leetcode·职场和发展
hnjzsyjyj3 小时前
“高精度算法”思想 → 大数阶乘
数据结构·高精度算法·大数阶乘
佳心饼干-4 小时前
C语言-09内存管理
c语言·算法
物联网牛七七4 小时前
4、数据结构与算法解析(C语言版)--栈
c语言·栈操作