PAT1038. Recover the Smallest Number (30)

http://pat.zju.edu.cn/contests/pat-a-practise/1038

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
本题用贪心算法,关键点: 由s1+s2 < s2+s1判断s1 < s2
逐个字符比较好麻烦,没想出解决办法。。。
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(string a, string b)
{
	return a + b < b + a;
}
int main(){
	int n;
	string s;
	vector<string> svec;
	scanf("%d", &n);
	while(n--){
		cin >> s;
		svec.push_back(s);
	}
	sort(svec.begin(), svec.end(), cmp);
	string ans;
	for(int i = 0; i < svec.size(); ++i)
		ans += svec[i];
	int flag = 0;
	for(int i = 0; i < ans.size(); ++i){
		if(flag ==0 ){
		 if(ans[i] == '0')
			 continue;
		 else{
			cout << ans[i];
			flag = 1;
		 }
		}
		else if(flag == 1)
			cout << ans[i];
	}
	if(flag == 0)
		printf("0");
	printf("\n");
	return 0;
 }


你可能感兴趣的:(PAT1038. Recover the Smallest Number (30))