PAT A1038. Recover the Smallest Number (30)

拟墨画扇 提交于 2021-02-18 08:01:52

 

原文链接: 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;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!