UVa 10905

  题目大意:给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 }
View Code

  记得以前看过这个故事,今天又看到了:某企业引进一条香皂包装生产线,结果发现经常有空盒流过。厂长请一个博士后花了200万设计出了自动分检系统,一乡镇企业遇到了同样问题,农民工花90元买一大电风扇放在生产线旁,有空盒经过便被吹走。具体到这道题中如何决定把哪个数放到前面,首先我就想到了去分析,结果分析了半天也没分析出个所以然,还是直接看结果来的简单实用啊。。。当然,分析同样重要,而高手应该就是知道在什么情况下用那种方法更简单有效,KISS。      -- 2013.7.26

原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3203458.html