首页 > 编程学习 > 蒜头君破案(stl—set,stl—vector练习)

蒜头君破案(stl—set,stl—vector练习)

发布时间:2022/10/1 14:16:20

ou_fan

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

输入格式
第一行将会输入两个数字n(1<=n<=2*105)和m(1<=m<=104)。n代表本市的人口数目。m代表犯罪团伙的数量。
后面n行每行有3个数字代表本市每个人的身高、体重、年龄、。然后会有m行每行有3个数字代表犯罪团伙每个人的身高、体重、年龄。

输出格式
输出m行,每行输出一个YES或者NO,YES代表是本市的,NO代表不是本市的。


样例输入:
3 2
166 50 30
178 60 23
132 40 15
167 50 30
178 60 23

样例输出:
NO
YES

 解题步骤:

1.结构体封装身高·体重·年龄

2.重载运算符,设立比较条件,进行排序,方便使用set容器;

3.读入数据,放入新建结构体类型的容器。

我使用了两种方法解这道题;

STL——vector容器;

//ou_fan
#include<bits/stdc++.h>
using namespace std;
struct people {
	int high;
	int weight;
	int age;
	//构造函数:方便读入
	people(int a, int b, int c) {
		high = a;
		weight = b;
		age = c;
	}
};//封装身高等数据
vector<people>v;//创建vector,用于存放结构体
int main() {
	int m, n, num1, num2, num3;
	cin >> n >> m;
	for (int i = 0;i < n;i++) {
		cin >> num1 >> num2 >> num3;
		v.push_back(people(num1,num2,num3));
	}
	auto it = v.begin();
	int i;
	for (it, i = 0;i < m;it++, i++) {
		cin >> num1 >> num2 >> num3;
		if ((*it).high == num1 && (*it).weight == num2 && (*it).age == num3) {
			cout << "YES" << endl;
		}
		else cout << "NO" << endl;
	}
}

对比(结构体+数组),该方法不用考虑开多大的数组;

STL——set容器;

//ou_fan
#include<bits/stdc++.h>
using namespace std;
struct people{
	int high;
	int weight;
	int age;
	people(int a, int b, int c) {
		high = a;
		weight = b;
		age = c;
	}
	bool operator <(const people& rhs)const {
		if (high != rhs.high) { return high < rhs.high; }
		else if (weight != rhs.weight) {return weight < rhs.weight;}
		else  return age < rhs.age; 
	}//无论怎么给,都要比较出一个结果; 
};
set<people>s;
int main(){
	int n, m, h, w, age;
	cin >> n >> m;
	for (int i = 0;i < n;i++) {
		cin >> h >> w >> age;
		s.insert(people(h,w,age));//使用了构造函数,所以这样读入方便
	}
	for (int i = 0;i < m;i++) {
		cin >> h >> w >> age;
		if (s.count(people(h, w, age))) {
			cout << "YES" << endl;
		}
		else cout << "NO" << endl;
	}
}

这个方法需要重载运算符,因为set是自动排序去重容器;需要比较条件;并且使用到了构造函数

构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
名称与类的名称是完全相同的,不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。

若不用构造函数,则需要定义一个结构体变量,先赋值给结构体变量,再把结构体变量放入set中。过程如下:

people p;

p.age=a;p.high=high;p.weight=w;

s.insert(p);

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号