AOAPC I Volume 1. Sorting/Searching

一、题目

二、做题笔记

1.10420 – List of Conquests

知识点:字符串排序,及相似字符串统计。

题目和10815相当类似,稍微修改下输出和读取格式即可。(C版本,使用qsort进行排序,自己实现用于比较字符串的compare函数)

答题记录:AC

拓展:可以写C++版本,调用<algorithm>中的sort函数进行排序。

2.10474 – Where is the Marble?

知识点:整数排序,使用qsort.

答题记录:AC

3.152 – Tree’s a Crowd

知识点:整数最值,可以通过过滤范围外的数减少遍历计算量。

同时,查找某数平方根的范围区间时,若数量较少,可以采用表查找该数:list = 0,1,4,9,16,25..找到索引位置可得到该数平方根区间,从而避免开方运算。

答题记录:AC

4.299 – Train Swapping

知识点:考察交换排序。

答题记录:AC

5.120 – Stacks of Flapjacks

知识点:排序。

答题记录:WA

对题目理解错误,题目的排序要求整个序列都是有序的(sort),而不是只要求最大最小值在两端。

6.156 – Ananagrams

知识点:字符串排序,包括:字符大小写转换、字符小写字母排序,字符混合字母排序,字符串查重,由于每个字符串用到的信息比较多,因此建立一个结构体存储各状态并关联。

C优化:排序时要求大写在前,小写在后,根据ASCII码表,我们可以发现‘A‘ < ‘Z’ < ‘a’ < ‘z’;按照ASCII值排序即可,说明strcmp已经做好了这方面的工作,大小写排序不需要做特殊处理。

因此,可以建立结构体排序,处理后字母优先级为一,处理前字母优先级为二。

C++学习:

数据特点:字符串经过处理后,我们保留的字符串是不重复的并且只需要处理前的字符串,对于处理后出现重复的字符串我们并不需要。

可以利用vector和map配合快速解决问题:

1.第一种:使用multimap<string,string>(采用处理后字符串作为键,可能重复,故不能使用map)。map会自动排序。

利用multimap.count方法找到值个数唯一的那么处理前字符,再加入vector进行排序。

2.第二种:使用map<string,int>统计处理后字符串个数。

找到个数唯一的string,与排好序后的原字符串vector配合。

7.400 – Unix ls

技巧:考察字符串排序,数据输出排版。

C版本:

若考虑浮点数精度问题:<float.h>

DBL_EPSILON:若直接取整加上这个偏差。若四舍五入加上0.5。

参考别人的答案时,发现并没有做精度处理也能得到AC。

C++学习:

1.cin如何判断文件结尾:

while( cin >> tmp ) cout << tmp << endl ;

2.采用vector和sort对数据进行存储和排序。

模板容器类vector <vector>

vector(向量): C++中的一种数据结构,确切的说是一个类。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。数组的缺点是分配空间不灵活;链表的缺点是无法通过下标快速找到结点。然而这里介绍的向量却吸收了这两种数据结构各自的优点,综合性能较高。向量的分配空间是会随着数据的量而变化的,如果空间不够,那么向量的空间会自动增长。类似于数组,我们也可以通过下标来访问向量中的数据元素,增快找到数据的速度。

vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。

8.123 – Searching Quickly

技巧:考察排序,字符串匹配,大小写转换。

C版本优化:

1.C语言调用qsort进行排序,所排序为字符串排序,排序比较函数里直接调用strcmp,不用自己些字符串比较函数。

2.字符串大小转换调用tolower,toupper (C++中也是如此),写成独立函数,方便以后再次调用。

C++版本优化:

使用模板容器类multimap:<map> map:键值不能重复,multimap:键值可以重复,排序严格按照插入先后顺序。

(分析:这道题也是处理字符串之间匹配,可以用字符串作为键值找到记录,multimap解决输出时相同字符串先找到先输出的问题,使用multimap处理多键值情况。)

插入map时使用make_pair(a,b) 或 pair<type_a, type_b>(a,b)

使用模板容器类set存储集合,这些数据必须是唯一的。(反应出数据特点:互不相同;)<set>

(分析:题目中ignore单词列表都是唯一的,后面用于搜索,可采用set存储)

set 和 map 比较:

MAP的节点是一对数据. SET的节点是一个数据.

set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。

爱的力量大到可以使人忘记一切,却又小到连一粒嫉妒的沙石也不能容纳

AOAPC I Volume 1. Sorting/Searching

相关文章:

你感兴趣的文章:

标签云: