您的位置:首页 > 编程语言 > Go语言

Sicily 1198 Substring

2015-09-11 15:58 363 查看
1.问题内容:

题目链接

2.问题分析:

可能大家一开始看这道题觉得很水,就是将那些字符串排序然后连接起来就行啦!记得大一我就是这样。提交之后发现过不了,后来再仔细想想发现并不是我想的那样。

开始我想用贪心算法的思路来解这道题(贪心算法简介),然而这个思路其实就有问题,通过贪心算法求得的子过程最优解并不能逐步求得全局的最优解。

考虑一组测试就懂了:

a, aba, ab (显然:a < ab < aba,结果不是:aababa,而是:aabaab)

3.解题思路:

那么如何解呢?其实就通过排序就可以了,只不过排序的比较因子,不是默认的字典序,而是这个:return (s1 + s2 < s2 + s1)。请各位细看,这个排序因子排序的结果就是:a < aba < ab(见上面的实例),然后再一前后连接起来就是正解(aabaab)了。

4.参考代码:

#include<iostream>


07.
#include<string>


08.
 

09.
using
 
namespace
 
std;


10.
 

11.
bool
 
cmp(string
s1, string s2) {


12.
return
 
(s1
+ s2 < s2 + s1);


13.
}


14.
 

15.
int
 
main()
{


16.
int
 
test_case;


17.
cin
>> test_case;


18.
 

19.
while
(test_case--)
{


20.
int
 
num;


21.
cin
>> num;


22.
string
str[num];


23.
for
 
(
int
 
i
= 0; i < num; i++) {


24.
cin
>> str[i]; 


25.
}


26.
 

27.
for
 
(
int
 
i
= 0; i < num; i++) {


28.
for
 
(
int
 
j
= i + 1; j < num; j++) {


29.
if
 
(!cmp(str[i],
str[j])) {


30.
string
temp = str[i];


31.
str[i]
= str[j];


32.
str[j]
= temp;


33.
}


34.
}


35.
}


36.
/*----------


37.
in
a simpler way:


38.
include
algorithm


39.
sort(str,
str+num, cmp);


40.
------------*/


41.
string
res = 
""
;


42.
for
 
(
int
 
i
= 0; i < num; i++) {


43.
res
+= str[i];


44.
}


45.
 

46.
cout
<< res << endl;


47.
}


48.
}

5.备注:

见代码中注释部分,可以直接引用algorithm里的sort函数(需要传入我们自定义的排序因子)

关于sort函数的详细信息(c++官网介绍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  1198 algorithm 算法 排序