ACM——01排序

http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1024

01排序

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交: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 }

ACM——01排序,布布扣,bubuko.com

时间: 2024-10-07 01:53:08

ACM——01排序的相关文章

ACM——简单排序

简单选择排序 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:836            测试通过:259 描述 给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中的简单选择排序算法进行排序,并输出排序过程中每趟及最后结果的相应序列. 输入 共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤400,每个元素值范围为 [0,100000) 输出 三个部分 第1部分为两行,第1行输出文字“Source:

ACM 01背包问题1

Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of V ,and

ACM 01背包问题

Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually gets caught in the end, often because they become too greedy. He has decided to work in the lucrative business of bank robbery only for a s

Super Object Toolkit (支持排序)

(* * Super Object Toolkit * * Usage allowed under the restrictions of the Lesser GNU General Public License * or alternatively the restrictions of the Mozilla Public License 1.1 * * Software distributed under the License is distributed on an "AS IS&q

superobject 设定排序方式

(* * Super Object Toolkit * * Usage allowed under the restrictions of the Lesser GNU General Public License * or alternatively the restrictions of the Mozilla Public License 1.1 * * Software distributed under the License is distributed on an "AS IS&q

JZOJ4605. 排序(线段树合并与分裂)

题目大意: 每次把一个区间升序或降序排序,最后问一个点是什么. 题解: 如果只是问一个点,这确乎是个经典题,二分一下答案然后线段树维护01排序. 从pty那里get到了可以用线段树的合并与分裂实时地维护整个序列. 考虑一次排序就把这个区间的数搞到一个线段树上,在根处标记是正的还是反的. 如果想搞到一棵树上就需要用到分裂与合并,根据势能分析,复杂度还是\(O(n~log~n)\). Code: #include<bits/stdc++.h> #define fo(i, x, y) for(int

贪心算法(2)-Kruskal最小生成树

什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树其实是最小权重生成树的简称.生成树的权重是考虑到了生成树的每条边的权重的总和. 最小生成树有几条边? 最小生成树有(V – 1)条边,其中V是给定的图的顶点数量. Kruskal算法 下面是步骤寻找MST使用Kruskal算法 1 1,按照所有边的权重

2017.11.27T19_8

ackage com.xdf; import java.util.Scanner; public class ArrayDemo01 { /**  * 数组:    *    01.在内存中存储一组相同数据类型的集合!  *    02.数组会在内存中开辟一串连续的空间来保存数据!  *    03.数组的长度一旦被定义,不能被改变  *    04.数组的下标最大值=数组的长度-1  *      * 数组中相关概念:  *    01.定义数组  *     int  []  nums1;

巢哑偕倥乇椭煞谙暗逞帕俸

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求