PAT 1038. Recover the Smallest Number
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<queue> #include<vector> #include<cmath> #include<iomanip> #include<algorithm> using namespace std; struct Node { char strNum[10]; bool isUsed; }; //获得字典序最小的数字,321,32这种情况要特殊考虑。 string getMinStr(vector<Node> &v) { string strMin = ""; int i, index = -1, indexMin = -1; for(i=0; i<v.size(); i++) if(!v[i].isUsed) { strMin = v[i].strNum; indexMin = i; v[i].isUsed = true; break; } for(i=0; i<v.size(); i++) if(!v[i].isUsed && (v[i].strNum+strMin) < (strMin+v[i].strNum) ) { strMin = v[i].strNum; index = i; } if(index != -1 && index!=indexMin) { v[index].isUsed = true; v[indexMin].isUsed = false; } return strMin; } int main() { Node node; vector<Node> vNode; int N,i; // cin>>N; scanf("%d",&N); for(i=0; i<N; i++) { scanf("%s",node.strNum); // cin>>node.strNum; node.isUsed = false; vNode.push_back(node); } string strNum = ""; string strTmp = getMinStr(vNode); while( strTmp != "")//若相等,则表示所有的数据已经用完。 { strNum += strTmp; strTmp = getMinStr(vNode); } for(i=0; i<strNum.length(); i++) if(strNum[i] != '0') break; //全部都为0的情况 if(i == strNum.length()) cout<<0<<endl; else { for(;i<strNum.length(); i++) cout<<strNum[i]; cout<<endl; } return 0; }
多学习,多总结。