【PAT甲级】1038 Recover the Smallest Number (30 分)

题意:

输入一个正整数N(<=10000),接下来输入N个字符串,每个字符串包括至多8个字符,均为数字0~9。输出由这些字符串连接而成的最小数字(不输出前导零)。

trick:

数据点0只包含没有0的串。

数据点2,5,6包含最小串全部为0且次小串含有前导零的数据。

如果所有的数字均为0,输出一个0即可。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 string s[10007];
 5 bool cmp(string a,string b){
 6     string c=a+b;
 7     string d=b+a;
 8     int posc=0;
 9     while(c[posc]=='0')
10         ++posc;
11     int posd=0;
12     while(d[posd]=='0')
13         ++posd;
14     if(posc>posd)
15         return 1;
16     else if(posc<posd)
17         return 0;
18     else{
19         if(c<d)
20             return 1;
21         else
22             return 0;
23     }
24 }
25 int main(){
26     ios::sync_with_stdio(false);
27     cin.tie(NULL);
28     cout.tie(NULL);
29     int n;
30     cin>>n;
31     for(int i=1;i<=n;++i)
32         cin>>s[i];
33     sort(s+1,s+1+n,cmp);
34     int posi=0,posj=0,flag=0;
35     for(int i=1;i<=n;++i){
36         for(int j=0;j<s[i].size();++j)
37             if(s[i][j]!='0'){
38                 flag=1;
39                 posi=i;
40                 posj=j;
41                 break;
42             }
43         if(flag)
44             break;
45     }
46     if(!flag)
47         cout<<0;
48     else{
49         for(int j=posj;j<s[posi].size();++j)
50             cout<<s[posi][j];
51         for(int i=posi+1;i<=n;++i)
52             for(int j=0;j<s[i].size();++j)
53                 cout<<s[i][j];
54     }
55     return 0;
56 }

 

 

 

 

posted @ 2019-09-25 00:51  sewage  阅读(261)  评论(0编辑  收藏  举报