1038. Recover the Smallest Number (30)

来源:互联网 发布:局域网网站搭建 ubuntu 编辑:程序博客网 时间:2024/05/18 13:07

1038. Recover the Smallest Number (30)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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


#include<iostream>#include<string>#include<algorithm>using namespace std;int times[10];int t=0;bool compare1(string a,string b){if(a==b)return false;int i;int min1=min(a.size(),b.size());for(i=0;i<min1;i++){if(a[i]!=b[i])return a[i]<b[i];}int tt=0;if(a.size()==min1){while(b.size()>i+tt){if(b[i+tt]!=b[tt])return b[i+tt]>b[tt];tt++;}return true;}while(a.size()>i+tt){if(a[i+tt]!=a[tt])return a[i+tt]<a[tt];tt++;}return true;}int main(){int N;cin>>N;int i,j;for(i=0;i<10;i++)times[i]=0;string *s=new string[N];for(i=0;i<N;i++){cin>>s[i];times[s[i][0]-'0']++;}sort(s,s+N,compare1);string t;int fir=0;for(i=0;i<N;i++){if(i==0){for(j=0;j<s[0].size();j++){if(s[0][j]!='0')fir=1;if(fir==1)t+=s[0][j];}}elset+=s[i];}int iszero=0;for(i=0;i<t.size();i++)if(t[i]!='0')iszero=1;if(iszero==0)cout<<0;elsecout<<t;}
感想:
做法:先排序,快速排序,然后再加起来
要点,1.例如像32,321,3214这样的序,排序不是直接排的,具体看我的compare1函数
2.前面的零要去掉
3.不要出现输出类似00的情况
0 0