原文链接: PAT A1038. 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 (<=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 87
Sample Output:
22932132143287
题意:
给出若干可能含有前导0的数字串,将他们按照某个顺序拼接,使得生成的数字最小
对数字串s1和s2,如果 s1+s2 < s2+s1那么就将s1放在s2的前面,否则把s2放在s1的前面
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAX = 10010;
string str[MAX];
//如果a+b < b+a 就把a排在前面
int cmp(string a, string b) {
return a + b < b + a;
}
int main(int argc, char *argv[]) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
cin >> str[i];
sort(str, str + n, cmp);
string ans;
for (int i = 0; i < n; i++)
ans += str[i];
int i = 0;
while (i < ans.size() - 1 && ans[i] == '0')i++;
while (i < ans.size())
printf("%c", ans[i++]);
printf("\n");
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/2856757/blog/846621