【C++算法练习题】常⽤的STL
问题⼀:计算集合的并
给你两个集合,计算其并集,即 。
注: 中不允许出现重复元素,但是 与 之间可能存在相同元素。
输⼊格式
输⼊数据分为三⾏,第⼀⾏有两个数字 ,分别表⽰集合 A 和集合 B 的元素个数。后两⾏分别表⽰集合 A 和集合 B。每个元素为不超出int范围的整数,每个元素之间⽤⼀个空格隔开。
输出格式
输出⼀⾏数据,表⽰合并后的集合,要求从⼩到⼤输出,每个元素之间⽤⼀个空格隔开。春节作文500字
样例输⼊1
1 2
1
2 3
样例输出1
1 2 3
样例输⼊2
1 2
1
1 2
样例输出2
1 2
问题分析
很简单的题⽬,使⽤ t 即可完成,需要注意的是 t 的使⽤⽅法。
begin() //返回t容器的第⼀个元素
end() //返回t容器的最后⼀个元素
clear() //删除t容器中的所有的元素
empty() //判断t容器是否为空
max_size() //返回t容器可能包含的元素最⼤个数
size() //返回当前t容器中的元素个数
rbegin //返回的值和end()相同
rend() //返回的值和rbegin()相同
count() //⽤来查找t中某个某个键值出现的次数。这个函数在t并不是很实⽤,因为⼀个键值在t只可能出现0或1次,这样就变成了判断某⼀键值是否在t出equal_range() //返回⼀对定位器,分别表⽰第⼀个⼤于或等于给定关键值的元素和第⼀个⼤于给定关键值的元素,这个返回值是⼀个pair类型,如果这⼀对定位器中哪era(iterator) //删除定位器iterator指向的值
era(first,cond) //删除定位器first和cond之间的值
era(key_value) //删除键值key_value的值
find() ,返回给定值值得定位器,如果没找到则返回end()。
inrt(key_value); 将key_value插⼊到t中,返回值是pair<t<int>::iterator,bool>,bool标志着插⼊是否成功,⽽iterator代表插⼊的位置,若key_value已经在t中lower_bound(key_value) ,返回第⼀个⼤于等于key_value的定位器
upper_bound(key_value),返回最后⼀个⼤于key_value的定位器
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
t<int> res;
int n, m;
cin >> n >> m;
int tmp;
for(int i = 0; i < n; i++){
cin >> tmp;
res.inrt(tmp);
}
for(int i = 0; i < m; i++){
cin >> tmp;
res.inrt(tmp);
}
for(t<int>::iterator it = res.begin(); it != d(); ++it){
if(it == res.begin()) cout << (*it);
el cout << " " << (*it);
}
return 0;
}
问题⼆:⽔果店
⼩A经营着⼀个不⼤的⽔果店。他认为⽣存之道就是经营最受顾客欢迎的⽔果。现在他想要⼀份⽔果销售情况的明细表,这样就可以很容易掌握所有⽔果的销售情况了。⼩A告诉你每⼀笔销售记录的⽔果名称,产地和销售的数量,请你帮他⽣成明细表。
输⼊格式
第⼀⾏是⼀个整数 ,表⽰共有 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<string, map<string, int>> table;
但需要注意他们地访问⽅式。
map<string, map<string, int>>::iterator it1;
map<string, int>::iterator it2;
for(it1 = table.begin(); it1 != d(); ++it1){
cout << it1->first << endl; //等于(*it1).first
for(it2 = it1->cond.begin(); it2 != it1-&d(); ++it2){
cout << " |----" << it2->first << "(" << it2->cond << ")" << endl;
}
}
代码
#include<bits/stdc++.h>
using namespace std;
map<string, map<string, int>> 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<string, map<string, int>>::iterator it1;
map<string, int>::iterator it2;
房屋建筑施工
for(it1 = table.begin(); it1 != d(); ++it1){
cout << it1->first << endl;
河南旅游景点for(it2 = it1->cond.begin(); it2 != it1-&d(); ++it2){
cout << " |----" << it2->first << "(" << it2->cond << ")" << 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]);
}
一般人格权代码