一道set例题

时间:2022-12-29 11:01:27

一、题目

最近某地连续发生了多起盗窃案件,根据监控和路人提供的线索得知,这是一个犯罪团伙。并且还知道这个犯罪团伙中每个人的身高、体重、年龄。警察想知道这个犯罪团伙中的每个人是不是本市的(如果本市有这个特征的人就认为是本市的)。但本是人口太多,又不能一个一个排查。警察又急需这条信息来缩小范围,所以警察特来找到聪明的你来解决这个棘手的问题。

输入格式

第一行将会输入两个数字n(1<=n<=2e5)和m(1<=m<=1e4)。n代表本市的人口数目,m代表犯罪团伙的数量。

后面n行每行有3个数字代表本事每个人的身高、体重、年龄。然后会有m行每行有3个数字代表犯罪团伙每个人的身高、体重、年龄。

输出格式

输出m行,没啊很难过输出一个“yes”或“№”,“yes”代表这个罪犯是本市的,“№”代表这个罪犯不是本市的。

样例输入和输出

一道set例题

二、解题思路

这题本质上就是,在你输入的数据中和给的数据是否匹配。因此想到set集合,并且利用set集合中含有的count判断元素是否存在于集合中,来解答。解题过程中,因为含有身高体重年龄这三个变量,将set和结构体进行联合,因为变量过多,采用在结构体中,创建构造函数,方便在主函数中传参,且当set和结构体联合使用时,一定要确切的重载运算符


三、源码和注释

#include<set>//数据结构set的头文件
#include<vector>
using namespace std;
struct people
{
int h;
int w;
int age;
people(int _h, int _w, int _age)
{
h = _h;
w = _w;
age = _age;
}//在结构体中创建一个构造函数,方便在主函数中传参(当结构体中定义多个变量时使用)
bool operator<(const people& rhs) const
{
if (h != rhs.h)
{
return h < rhs.h;
}
if (w != rhs.h)
{
return w < rhs.w;
}
return age < rhs.age;
}//set与结构体联合使用时,一定要 确切地 重载运算符!
};
set<people> a;//定义集合
int main()
{
int n, m, h, w, age;
cin >> n >> m;
for (int i=0;i<n;i++)
{
cin >> h >> w >> age;
a.insert(people(h,w,age));
}
for (int i=0;i<m;i++)
{
cin >> h >> w >> age;
if (a.count(people(h,w,age)))//当结构体和set联合时,不能直接传参!(利用构造函数传参)
{
cout<<"yes"<<endl;
}
else
{
cout << "no" << endl;
}
}
return 0;
}