【C++算法练习题】常用的STL

问题一:计算集合的并

给你两个集合,计算其并集,即 \lbrace A \rbrace + \lbrace B \rbrace

注: 中不允许出现重复元素,但是 \lbrace A \rbrace\lbrace B \rbrace 之间可能存在相同元素。

输入格式

输入数据分为三行,第一行有两个数字 n, m\ (0<n,m\leq 10000),分别表示集合 A 和集合 B 的元素个数。后两行分别表示集合 A 和集合 B。每个元素为不超出int范围的整数,每个元素之间用一个空格隔开。

输出格式

输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间用一个空格隔开。

样例输入1

1 2
1
2 3

样例输出1

1 2 3

样例输入2

1 2
1
1 2

样例输出2

1 2

问题分析

很简单的题目,使用 set 即可完成,需要注意的是 set 的使用方法

begin()      //返回set容器的第一个元素

end()     //返回set容器的最后一个元素

clear()     //删除set容器中的所有的元素

empty()    //判断set容器是否为空

max_size()   //返回set容器可能包含的元素最大个数

size()     //返回当前set容器中的元素个数

rbegin     //返回的值和end()相同

rend()     //返回的值和rbegin()相同

count()        //用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。

equal_range()  //返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。

erase(iterator)  //删除定位器iterator指向的值

erase(first,second)    //删除定位器first和second之间的值

erase(key_value)    //删除键值key_value的值

find()  ,返回给定值值得定位器,如果没找到则返回end()。

insert(key_value); 将key_value插入到set中 ,返回值是pair::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。

lower_bound(key_value) ,返回第一个大于等于key_value的定位器

upper_bound(key_value),返回最后一个大于key_value的定位器

代码

#include
using namespace std;
int main(){
    set res;
    int n, m;
    cin >> n >> m;
    int tmp;
    for(int i = 0; i < n; i++){
        cin >> tmp;
        res.insert(tmp);
    }
    for(int i = 0; i < m; i++){
        cin >> tmp;
        res.insert(tmp);
    }
    for(set::iterator it  = res.begin(); it != res.end(); ++it){
        if(it == res.begin())	cout << (*it);
        else cout << " " << (*it);
        
    }
    return 0;
}

问题二:水果店

小A经营着一个不大的水果店。他认为生存之道就是经营最受顾客欢迎的水果。现在他想要一份水果销售情况的明细表,这样就可以很容易掌握所有水果的销售情况了。小A告诉你每一笔销售记录的水果名称,产地和销售的数量,请你帮他生成明细表。

输入格式

第一行是一个整数 N\ (0 < N \le 1000) ,表示共有 N 次成功的交易。其后有 N 行数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过 100),水果产地(小写字母组成,长度不超过 100)和交易的水果数目(正整数,不超过 1000)组成。

输出格式

请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表。这份明细表包括所有水果的产地、名称和销售数目的信息。水果先按产地分类,产地按字母顺序排列;同一产地的水果按照名称排序,名称按字母顺序排序。

样例输入

5
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1

样例输出

guangdong
   |----pineapple(5)
   |----sugarcane(1)
shandong
   |----apple(3)

问题分析

这道题我们巧妙地使用了一个Map嵌套一个Map从而替代了结构体。

map> table;

 但需要注意他们地访问方式。

map>::iterator it1;
    map::iterator it2;
    for(it1 = table.begin(); it1 != table.end(); ++it1){
        cout << it1->first << endl;    //等于(*it1).first
        for(it2 = it1->second.begin(); it2 != it1->second.end(); ++it2){
            cout << "   |----" << it2->first << "(" << it2->second << ")" << endl;
        }
    }

代码

#include
using namespace std;
map> table;
int n;
int main(){
    cin >> n;
    string fruit;
    string province;
    int cnt;
    for(int i = 1; i <= n; ++i){
        cin >> fruit >> province >> cnt;
        table[province][fruit] += cnt;
    }
    map>::iterator it1;
    map::iterator it2;
    for(it1 = table.begin(); it1 != table.end(); ++it1){
        cout << it1->first << endl;
        for(it2 = it1->second.begin(); it2 != it1->second.end(); ++it2){
            cout << "   |----" << it2->first << "(" << it2->second << ")" << endl;
        }
    }
    return 0;
}

问题三:学英语

小A快要考托福了,这几天,小A每天早上都起来记英语单词。小B时不时地来考一考蒜头君:小B会询问蒜头君一个单词,如果小A背过这个单词,小A会告诉小B这个单词的意思,不然小A会跟小B说还没有背过。单词是由连续的大写或者小写字母组成。注意单词中字母大小写是等价的。比如"You""you"是一个单词。

输入格式

首先输入一个  表示事件数。接下来 n 行,每行表示一个事件。每个事件输入为一个整数 d 和一个单词 word(单词长度不大于 20),用空格隔开。如果 d=0,表示小A记住了 word 这个单词,如果 d=1,表示这是一个 测试,测试小A是否认识单词 word(小B不会告诉蒜头君这个单词的意思)。事件的输入是按照时间先后顺序输入的

输出格式

对于小B的每次 测试,如果小A认识这个单词,输出一行"Yes", 否则输出一行"No"

样例输入1

5
0 we
0 are
1 family
0 Family
1 Family

样例输出1

No
Yes

样例输入2

4
1 jisuanke
0 Jisuanke
0 JISUANKE
1 JiSuanKe

样例输出2

No
Yes

问题分析

主要就是考大小写转换地小技巧。

for(int j = 0; j < word.length(); ++j){
    word[j] = tolower(word[j]);
}

代码

#include
using namespace std;
set st;
int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i){
        int opt;
        string word;
        cin >> opt >> word;
        
        if(opt == 0){
            st.insert(word);
        }else{
            if(st.count(word)){
                cout << "Yes" << endl;
            }else{
                cout << "No" << endl;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(C++算法小模板)