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.
}
见代码中注释部分,可以直接引用algorithm里的sort函数(需要传入我们自定义的排序因子)
关于sort函数的详细信息(c++官网介绍)