题目大意:给n个正整数,对这n个数进行拼接,共有n!种方案(在n个数互不相同的情况下),找出其中最大的拼接数。如123,124,结果为124123。
开始考虑用字典序,不过这在两个数长度相同时正确,在长度不同时就出问题了,于是各种纠结...后来看别人代码,发现直接把两个数按不同方案拼接再比较就行了,直接根据结果进行判定,而不是分析每个数,是个好方法!排完序后按从大到小的顺序输出就行了,这其中含有贪心的思想。
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 #define MAXN 50+5 7 8 string num[MAXN]; 9 10 bool cmp(const string a, const string b) 11 { 12 string s1 = a+b, s2 = b+a; 13 return s1 > s2; 14 } 15 16 int main() 17 { 18 #ifdef LOCAL 19 freopen("in", "r", stdin); 20 #endif 21 int n; 22 while (cin >> n && n) 23 { 24 for (int i = 0; i < n; i++) 25 cin >> num[i]; 26 sort(num, num+n, cmp); 27 for (int i = 0; i < n; i++) 28 cout << num[i]; 29 cout << endl; 30 } 31 return 0; 32 }
记得以前看过这个故事,今天又看到了:某企业引进一条香皂包装生产线,结果发现经常有空盒流过。厂长请一个博士后花了200万设计出了自动分检系统,一乡镇企业遇到了同样问题,农民工花90元买一大电风扇放在生产线旁,有空盒经过便被吹走。具体到这道题中如何决定把哪个数放到前面,首先我就想到了去分析,结果分析了半天也没分析出个所以然,还是直接看结果来的简单实用啊。。。当然,分析同样重要,而高手应该就是知道在什么情况下用那种方法更简单有效,KISS。 -- 2013.7.26