PAT A1038. Recover the Smallest Number (30)
PAT A1038. Recover the Smallest Number (30)
阿豪boy 发表于10个月前
PAT A1038. Recover the Smallest Number (30)
  • 发表于 10个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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;
}

 

共有 人打赏支持
粉丝 3
博文 468
码字总数 353270
×
阿豪boy
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: