1038. Recover the Smallest Number (30)
时间限制
400 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given {32, 321, 3214, 0229, 87}, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders of combinations of these segments, and the smallest number is 0229-321-3214-32-87.
Input Specification:
Each input file contains one test case. Each case gives a positive integer N (<=10000) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the smallest number in one line. Do not output leading zeros.
Sample Input:
5 32 321 3214 0229 87Sample Output:
22932132143287
我做题都是先用python秒一下,要是超时什么的就换C++了,这题我一看,就写了下面这一行代码:
print int(''.join(sorted(raw_input().split()[1:], lambda s1, s2: cmp(s1+s2, s2+s1))))
是的只有一行!可惜最后一个test还是超时了。于是用C++再写:
#include <set> #include <sstream> #include <string> #include <iostream> using namespace std; class mstring : public string { public: inline bool operator<(const string &s) const { string tmpa(*this); tmpa.append(s); string tmpb(s); tmpb.append(*this); return tmpa.compare(tmpb) < 0; } }; int main() { //#pragma warning(disable:4996) //freopen("..\advanced-pat-python\test.txt", "r", stdin); int N; cin >> N; set<mstring> nums; mstring ms; while (N--) { cin >> ms; nums.insert(ms); } mstring num; set<mstring>::iterator it = nums.begin(); while (it!=nums.end()) { num += *(it++); } while (!num.empty() && *num.begin()=='0') { num.erase(num.begin()); } if (num.empty()) { num += '0'; } cout << num << endl; }
总体来说还是较为简单的,但是没有Python那么爽的一行解决掉了。Python真是神奇的语言啊。