P8833 [传智杯 #3 决赛] 课程

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

[传智杯 #3 决赛] 课程

题目背景

disangan233 喜欢数数,于是他想让你帮他回答一个问题。

题目描述

传智专修学院提供 A,BA,B 两个课程,分别有 n,mn,m 个学生报名。报名 AA 的学生的编号为 ana_n,报名 BB 的学生的编号为 bmb_m,求有多少个学生同时报名了两个课程。

对于所有数据,n,m,ai,bi20n,m,a_i,b_i\leq 20,保证每个课程报名的学生编号不会重复。

输入格式

输入共 33 行。

11 行输入 22 个正整数 n,mn,m

22 行输入 nn 个正整数 a1ana_1\ldots a_n,表示报名课程 AA 的学生编号。

33 行输入 mm 个正整数 b1bmb_1\ldots b_m,表示报名课程 BB 的学生编号。

学生编号不保证从小到大排序。

输出格式

输出共 1111 个整数,表示答案。

样例 #1

样例输入 #1

5 5
1 2 3 4 5
1 3 4 5 6

样例输出 #1

4

提示

样例解释

我们发现,1,3,4,51,3,4,544 名学生同时报名了两门课程,所以答案是 44

思路分析

众所周知,map是个好东西!
建立映射的思维常用于编程思想,我们要利用map的特性来解决问题!

  • 1.考虑到排序无用,只是要计数就行了,那么就使用unordered_map来建立索引
  • 2.建立unordered_map<int,int>的索引
  • 3.存储课程A的数据
    • 直接将值存入
  • 4.存储课程B的数据
    • 直接将值存入
  • 5.创建计数器
  • 6.用迭代器遍历统计
  • 7.输出

代码展示

#include<iostream>
#include<unordered_map>
using namespace std;

unordered_map<int, int>mp;

int main()
{
	int n, m;
	cin >> n >> m;
	int temp;
	for (int i = 1; i <= n; i++) {
		cin >> temp;
		mp[temp]++;
	}
	for (int i = 1; i <= m; i++) {
		cin >> temp;
		mp[temp]++;
	}
	int res = 0;
	for (unordered_map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
		if (it->second == 2) {
			res++;
		}
	}
	cout << res;
	return 0;
}

PS:决赛圈的第一题,map简简单单~