一、题目
最近某地连续发生了多起盗窃案件,根据监控和路人提供的线索得知,这是一个犯罪团伙。并且还知道这个犯罪团伙中每个人的身高、体重、年龄。警察想知道这个犯罪团伙中的每个人是不是本市的(如果本市有这个特征的人就认为是本市的)。但本是人口太多,又不能一个一个排查。警察又急需这条信息来缩小范围,所以警察特来找到聪明的你来解决这个棘手的问题。
输入格式
第一行将会输入两个数字n(1<=n<=2e5)和m(1<=m<=1e4)。n代表本市的人口数目,m代表犯罪团伙的数量。
后面n行每行有3个数字代表本事每个人的身高、体重、年龄。然后会有m行每行有3个数字代表犯罪团伙每个人的身高、体重、年龄。
输出格式
输出m行,没啊很难过输出一个“yes”或“№”,“yes”代表这个罪犯是本市的,“№”代表这个罪犯不是本市的。
样例输入和输出
二、解题思路
这题本质上就是,在你输入的数据中和给的数据是否匹配。因此想到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; }