您的位置:首页 > 其它

NOIP2010-普及组复赛模拟试题-第二题-数字积木

2015-08-15 22:12 387 查看
题目描述 Description

小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木
排成一排,所形成的数目最大是多少呢?
你的任务就是读入 n 个数字积木,求出所能形成的最大数。

输入输出格式 Input/output

输入格式:

第一行是一个整数 n (n≤1000),接下来 n 行每行是一个正整数。

输出格式:
所能形成的最大整数

输入输出样例 Sample input/output

样例测试点#1

输入样例:

3
13
131
343

[b]输出样例:
[/b]

34313131

[b][b]说明 description[/b][/b]

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


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

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

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

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

代码如下:

#include <stdio.h>
#include <string.h>
void sort(char array[][1001],int n)//排序函数
{
char temp[202];
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(array[k],array[j])<0)//大到小排序
k=j;
if(k!=i)
{
strcpy(temp,array[i]);   //字符串交换顺序
strcpy(array[i],array[k]);
strcpy(array[k],temp);
}
}
}
int main()
{
int n,i;
char str[1001][1001];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",str[i]);//输入N个字符串
}
sort(str,n);//对输入的字符串排序
for(i=0;i<n;i++)
{
printf("%s",str[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: