【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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)