首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于一路简单的ACM题目,求解释

2013-01-04 
关于一道简单的ACM题目,求解释数字接龙题目:给你n个数字,将这n个数字连接在一起成一个数字,数字大者为胜。

关于一道简单的ACM题目,求解释
             数字接龙

题目:给你n个数字,将这n个数字连接在一起成一个数字,数字大者为胜。

输入要求:输入多组测试数据,每组数据第一行是一个正整数n(1≤n≤10)。接下来n行每行一串字符串,长度不大于10 。

输出要求:每个测试数据输出一行,就是n串字符串连接成一串中字典序最大的那一串。

比如输入:2               输出:456123
          123
          456

    输入:3               输出:bbabba
          ba
          b
          bab
[解决办法]


// 并且,你需要考虑输入是多组的情况,那么代码还需要改动成下面的
// 希望你在代码这条路上不会畏惧艰难,可以走的更远。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int comp(const void *a, const void *b)
{
return strcmp((char *)b,(char *)a);
}

int main()
{
int n, k;
char a[10][10];

        // 如果scanf返回EOF,那么说明输入已经结束(在OJ中是用文件输入,EOF标志文件结尾)
while (EOF != scanf("%d\n", &n))
{
for(int i=0; i<n; i++)
gets(a[i]);

qsort(a,n,10,comp);

for(int i=0; i<n; i++)
printf("%s",a[i]);
puts("");
}
return 0;
}

[解决办法]
引用:
这题思路比较清楚,就是要最前面的数(字母)最大
那么就将所有的输入进行排序,qsort + strcmp
然后再把字符串一起printf就可以了。


嗯,使用STL的话,就更简单了。
string strOut;
list<string> strList;
string s1 = "123";
string s2 = "456";
string s3 = "012";
        strList.push_back(s1);
strList.push_back(s2);
strList.push_back(s3);

strList.sort();
strList.reverse();

for(list<string>::iterator iter = strList.begin(); iter != strList.end(); iter++)
{
strOut.append((*iter));
}

cout << strOut << endl;
[解决办法]
引用:
#include <stdio.h>;
#include <string.h>;
int main(){
int n, k;
char a[10][10];

scanf("%d\n", &amp;n);

for(int i=0; i<n; i++){
gets(a[i]);
}

for(int j=0; j<n; j++){
if(strc……


楼主 你这个程序的思路错了, 你这样每次排序都是相邻之间数组的排序。如果第三个字符串介于第一个字符串和第二个字符串之间,你这种方法就不对了。你的方法已经把第一个串和第二个串合并后的结果放在a[j+1]了。

热点排行