洛谷-拼数-NOIP1998提高组复赛

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷-拼数-NOIP1998提高组复赛相关的知识,希望对你有一定的参考价值。

题目描述 Description

设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
 输入输出格式 Input/output
输入格式:
第一行,一个正整数n。
第二行,n个正整数。
输出格式:
一个正整数,表示最大的整数
 输入输出样例 Sample input/output
样例测试点#1

输入样例:

3
13
131
343

输出样例:

34313131

说明 description

30%的数据, n≤l0,每个数<10^3。 50%的数据, n≤l00。 100%的数据, n≤1000,每个数<10^200。

 

思路:这题乍一看,wow,还蛮简单的哦。我当时的思路是:把这些数按顺序每个排一遍,比较一下大小,但这种方法实在很慢,几十个就爆了。

但可以仔细观察下一下规律:要使一个数更大,首先要使首位尽量的大,并且要使一个数的位数尽量的大!

太棒了,这就是正确的思路,怎么实现呢?这时,很快联想到,诶,这不是字符串的比较方法吗?!太棒了,就用字符串来解决!

这题就演变成了简单的字符串二维数组排序,太棒了!

代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 void sort(char array[][1001],int n)//排序函数
 4 {
 5     char temp[202];
 6     int i,j,k;
 7     for(i=0;i<n-1;i++)
 8     {
 9         k=i;
10         for(j=i+1;j<n;j++)
11             if(strcmp(array[k],array[j])<0)//大到小排序 
12             k=j;
13         if(k!=i)
14         {
15             strcpy(temp,array[i]);   //字符串交换顺序
16             strcpy(array[i],array[k]);
17             strcpy(array[k],temp);
18         }
19     }
20 }
21 int main()
22 {
23     int n,i;
24     char str[1001][1001];
25     scanf("%d",&n);
26     for(i=0;i<n;i++)
27     {
28         scanf("%s",str[i]);//输入N个字符串
29     }
30     sort(str,n);//对输入的字符串排序
31     for(i=0;i<n;i++)
32     {
33         printf("%s",str[i]);
34     }
35     printf("\n"); 
36     return 0;
37 }

 

以上是关于洛谷-拼数-NOIP1998提高组复赛的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1012 [NOIP1998 提高组] 拼数

洛谷P1012 [NOIP1998 提高组] 拼数

P1012 [NOIP1998 提高组] 拼数

[NOIP1998]拼数

洛谷 P1012 拼数

洛谷-谁拿了最多奖学金-NOIP2005提高组复赛