1、快递分拣
蓝桥王国的每个快递都包含两个参数:1.快递单号 2.快递城市。
小李是蓝桥王国的一名快递员,每天的快递分拣让他苦不堪言。
于是他想要你帮他设计一个程序用于快递的分拣(将不同快递按城市信息分开)。
输入第一行包含一个整数 �N,表示快递的个数。
接下来第 N+1 行每行包含一个字符串 �S 和一个字符串 �P,分别快递单号以及快递对应的城市。
1≤�≤1031≤N≤103,保证数据量不超过 106106。
输出描述
输出共若干行。按城市的输入顺序依次输出城市的名称以及城市的快递个数,以及该城市的所有快递单号(单号按照输入顺序排序)。
输入输出样例
10
10124214 北京
12421565 上海
sdafasdg213 天津
fasdfga124 北京
145252 上海
235wtdfsg 济南
3242356fgdfsg 成都
23423 武汉
23423565f 沈阳
1245dfwfs 成都
输出:
北京 2
10124214
fasdfga124
上海 2
12421565
145252
天津 1
sdafasdg213
济南 1
235wtdfsg
成都 2
3242356fgdfsg
1245dfwfs
武汉 1
23423
沈阳 1
23423565f
代码:
#include<iostream>
#include<vector>
using namespace std;vector<string> city;
vector<string> dig[1000];int Myfind(string s)
{for(int i=0;i<city.size();i++){if(city[i]==s) return i;}return -1;
}
int main()
{int n;cin>>n;for(int i=0;i<n;i++){string d,c;cin>>d>>c;int flag=Myfind(c);if(flag==-1){city.push_back(c);dig[city.size()-1].push_back(d);}else dig[flag].push_back(d);}for(int i=0;i<city.size();i++){cout<<city[i]<<" "<<dig[i].size()<<endl;for(int j=0;j<dig[i].size();j++)cout<<dig[i][j]<<endl;}
}
2、 CLZ银行问题
题目不难
#include <bits/stdc++.h>
using namespace std;
queue<string>n;
queue<string>v;
int main()
{int m;cin >> m;while (m--){string op, name, type;cin >> op;if (op == "IN"){cin >> name >> type;if (type == "V"){v.push(name);}else{n.push(name);}}else{cin >> type;if (type == "V")v.pop();elsen.pop();}}while (v.size()){cout << v.front() << '\n';v.pop();}while (n.size()){cout << n.front() << '\n';n.pop();}return 0;
}
1、队列:
queue<string> myqueue;
queue<int> myqueue_int;
front()
:返回queue
中第一个元素的引用。back()
:返回queue
中最后一个元素的引用。push(const T& obj)
:在queue
的尾部添加一个元素的副本。pop()
:删除queue
中的第一个元素。size()
:返回queue
中元素的个数。empty()
:如果queue
中没有元素的话,返回 true。
2、Vector 容器(类)
线性表中有 Vector
顺序表 和 list
链表,两者作用比较相似。
Vector
的主要作用就是可变长度的数组,就把他当成数组使用即可。
#include <vector> //头文件
vector<int> a; //定义了一个int类型的vector容器a
vector<int> b[100]; //定义了一个int类型的vector容器b组
struct rec
{···
};
vector<rec> c; //定义了一个rec类型的vector容器c
vector<int>::iterator it; //vector的迭代器,与指针类似
a.size() //返回实际长度(元素个数),O(1)复杂度
a.empty() //容器为空返回1,否则返回0,O(1)复杂度
a.clear() //把vector清空
a.begin() //返回指向第一个元素的迭代器,*a.begin()与a[0]作用相同
a.end() //越界访问,指向vector尾部,指向第n个元素再往后的边界
a.front() //返回第一个元素的值,等价于*a.begin和a[0]
a.back() //返回最后一个元素的值,等价于*--a.end()和a[size()-1]
a.push_back(x) //把元素x插入vector尾部
a.pop_back() //删除vector中最后一个元素
遍历方式两种:
for ( vector<int>::iterator it=a.begin() ; it!=a.end() ; it++ )cout<<*iterator<<endl;for ( auto it=a.begin() ; it!=a.end() ; it++ )cout<<*iterator<<endl;
当成数组使用:
for( int i=0;i<a.size();i++) cout<<a[i]<<endl;
3、Map映射:
map
是一个关联容器,它提供一对一的 hash
。
- 第一个可以称为关键字(
key
),每个关键字只能在map
中出现一次 - 第二个可能称为该关键字的值(
value
)
map
以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map
主要用于资料一对一映射(one-to-one
)的情況,map
在 C++
的內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在 map
内部所有的数据都是有序的。比如,像是管理班级内的学生,Key
值为学号,Value
放其他信息的结构体或者类。
1)定义方式:
map<char, int> mymap1;map<string, int> mymap2;
2)一般用法:
看容量:
int map.size();//查询map中有多少对元素
bool empty();// 查询map是否为空
插入:
map.insert(make_pair(key,value));//或者map.insert(pair<char, int>(key, value))//或者map[key]=value
取值:
map<int, string> map;//如果map中没有关键字2233,使用[]取值会导致插入
//因此,下面语句不会报错,但会使得输出结果结果为空
cout<<map[2233]<<endl;//但是使用使用at会进行关键字检查,因此下面语句会报错
map.at(2016) = "Bob";
遍历:
map<string, string>::iterator it;
for (it = mapSet.begin(); it != mapSet.end(); ++it)
{cout << "key" << it->first << endl;cout << "value" << it->second << endl;
}
查找:
m.count(key)://由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。
m.find(key)://返回迭代器,判断是否存在。
3、费里的语言:
题目描述
小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,判断是否出现重复的两个单词。
输入描述
第 11 行,输入 �N,代表共计创造了多少个单词。
第 22 行至第 �+1N+1 行,输入 �N 个单词。
1≤�≤1041≤N≤104,保证字符串的总输入量不超过 106106。
输出描述
输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出 NO
,多个重复单词输出最先出现的。
输入输出样例
输入:
5
sdfggfds
fgsdhsdf
dsfhsdhr
sdfhdfh
sdfggfds
输出:
sdfggfds
代码:
#include <iostream>
#include <map>
using namespace std;
map<string, bool> mp;
int main()
{int n;string ans = "NO";cin >> n;for (int i = 0; i < n; i++){string word;cin >> word;if (mp.count(word)) {ans = word;break;}else mp[word] = 1;}cout << ans << endl;return 0;
}