1038 Recover the Smallest Number (30 分)(a+b<b+a!)
题目描述:
1038 Recover the Smallest Number (30 分)
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 (≤) 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. Notice that the first digit must not be zero.
Sample Input:
5 32 321 3214 0229 87
Sample Output:
22932132143287
思路:a+b<b+a!
#include<iostream> #include<queue> #include<string.h> #include<string> #include<map> #include<unordered_map> #include<vector> #include<algorithm> #include<cmath> #include<set> using namespace std; const int maxn = 205; const int maxm = 100 + 1; #define INT_MAX 0x7777777 typedef long long ll; inline int read() { int X = 0; bool flag = 1; char ch = getchar(); while (ch < '0' || ch>'9') { if (ch == '-') flag = 0; ch = getchar(); } while (ch >= '0' && ch <= '9') { X = (X << 1) + (X << 3) + ch - '0'; ch = getchar(); } if (flag) return X; return ~(X - 1); } struct cmp { bool operator()(const string& a, const string& b) { return a + b < b + a; } }; multiset<string,cmp>S; int main() { int n = read(); string t; for (int i = 1; i <= n; i++) { cin >> t; S.insert(t); } string res; for (auto& i : S) { res += i; } int i = 0; while (res[i] == '0')i++; if (i == res.size()) { cout << "0" << endl; } else { printf("%c", res.c_str()+i); } return 0; }