洛谷-拼数-NOIP1998提高组复赛
题目描述 Description
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入输出格式 Input/output
输入格式:
第一行,一个正整数n。
第二行,n个正整数。
输出格式:
一个正整数,表示最大的整数
第一行,一个正整数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 }
我不怕千万人阻挡,只怕自己投降…