1038. Recover the Smallest Number (30)-PAT

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

推荐指数:※※

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

1.这道题目注意ab ba 排序是比较大小。

2.组合后,前面的0注意去掉。

3.全是0的数,注意最后留一个0.

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int N=11;
vector<char* > num;
int *visited,n;
bool compare(char *a, char *b){
	char tmp1[N*2],tmp2[N*2];
	strcpy(tmp1,a);
	strcpy(tmp1+strlen(a),b);

	strcpy(tmp2,b);
	strcpy(tmp2+strlen(b),a);
	return strcmp(tmp1,tmp2)<0;
}
int main()
{
	int i;
	scanf("%d",&n);
	visited=new int[n];
	memset(visited,0,sizeof(int)*n);
	for(i=0;i<n;i++){
		char *tmp=new char[N];
		scanf("%s",tmp);
		num.push_back(tmp);
	}
	sort(num.begin(),num.end(),compare);
	if(!num.empty()){
		for(i=0;i<num.size();i++){
			if(atoi(num[i])!=0){
				printf("%d",atoi(num[i]));
				break;
			}
		}
		if(i==num.size()){
			printf("0");
			return 0;
		}
		i++;
		for(;i<num.size();i++){
			printf("%s",num[i]);
		}
	}
	return 0;
}



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