ACM——01排序
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1024
01排序
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:708 测试通过:258
总提交:708 测试通过:258
描述
将01串首先按长度排序,长度相同时,按1的个数多少进行排序,1的个数相同时再按ASCII码值排序。
输入
输入数据中含有一些01串,01串的长度不大于256个字符。
输出
重新排列01串的顺序。使得串按基本描述的方式排序。
样例输入
10011111
00001101
1010101
1
0
1100
样例输出
0
1
1100
1010101
00001101
10011111
题目来源
ZJUT
1 #include<iostream> 2 #include<string> 3 //#include<fstream> 4 #include<vector> 5 using namespace std; 6 class Node 7 { 8 public: 9 string str; 10 int len; 11 int oneNum; 12 Node(string s) 13 { 14 str = s; 15 this->len = str.length(); 16 int tmp = 0; 17 for (size_t i = 0; i<len; i++) 18 if (str[i] == '1') tmp++; 19 oneNum = tmp; 20 } 21 }; 22 23 int cmp(Node& node1, Node& node2)//-1表示node1排在前面0表示node1和node2相等1表示node1排在node2后面 24 { 25 if (node1.len<node2.len) 26 return -1; 27 else if (node1.len>node2.len) return 1; 28 else //长度相等 29 { 30 if (node1.oneNum == node2.oneNum)//一的数目相等 31 { 32 size_t i; 33 for (i = 0; i<node1.len; i++){//比较ASCLL码值 34 if (node1.str[i]<node2.str[i]) return -1; 35 else if (node1.str[i]>node2.str[i]) return 1; 36 } 37 if (i == node1.oneNum) return 0;//二者相等 38 } 39 else if (node1.oneNum<node2.oneNum) return -1; 40 else //node1中1的数目比node2的多 41 return 1; 42 } 43 return 0; 44 } 45 int main() 46 { 47 //ifstream ifile("D:\\eee.txt"); 48 string str; 49 vector<Node> nVec; 50 while (cin>>str) 51 { 52 Node node(str); 53 if (true == nVec.empty()) 54 nVec.push_back(node); 55 else 56 { 57 vector<Node>::iterator iter = nVec.begin(); 58 for (iter; iter != nVec.end(); iter++){ 59 if (cmp(*iter, node) == 1){ 60 nVec.insert(iter, node); 61 break; 62 } 63 if (cmp(*iter, node) == 0){ 64 nVec.insert(iter, node); 65 break; 66 } 67 if (cmp(*iter, node) == -1) 68 ; 69 if (iter == nVec.end()-1){ 70 //nVec.insert(iter, node); 71 nVec.push_back(node); 72 break; 73 } 74 75 } 76 77 } 78 } 79 for (size_t i = 0; i<nVec.size(); i++) 80 { 81 cout << nVec[i].str << endl; 82 } 83 return 0; 84 }