[编程题]最佳配对
给定两个长度为N的整型数组A和B。如果Ai==Bj则认为(i,j)为最佳配对。所有的最佳配对在满足以下条件的情况下组成最佳配对集合:A和B中的各个元素最多在集合中出现一次。例如,A =「5, 10, 11,12, 14」,B = 「8, 9 ,11, 11, 5」,配对集合为「(0,4),(2,2),(2,3)」,因为在集合A中索引2出现了两次,所以上面的配对集合不是最佳配对集合。你的任务是修改B中的一个元素,使得最佳配对集合的元素最多。并输出最佳配对集合的数量。
输入描述:
输入第一行为一个数字N,表示数组A和B的长度。输入第2行和3行都是N个数字,分别表示数组A和B的元素
输出描述:
修改B中的一个元素,并打印最大的最佳配对集合数量。注意:必须修改B中的一个元素。
示例1
输入
4 1 2 3 4 1 2 3 3
输出
4
思路
- 使用
set
容器保存第一次输入的A
元素 - 输入
B
元素时,与set
进行查找,找到则nCount+1
,未找到则nDiff+1
- 输出时,如果
nDiff
为0
,说明A
和B
所有元素配对,需要改动一个B
元素,则输出nCount-1
,如果nDiff
不为0
,输出nCount+1
。
代码
#include<iostream>
#include<set>
using namespace std;
int main()
{
int n, temp, nCount = 0, nDiff = 0;
cin>> n;
set<int> s;
for (int i = 0; i < n; i++) {
cin>> temp;
s.insert(temp);
}
for (int i = 0; i < n; i++) {
cin>> temp;
if (s.find(temp) != s.end()) {
nCount++;
s.erase(s.find(temp));
}
else
nDiff++;
}
if (nDiff == 0)
cout<< --nCount;
else
cout<< nCount + 1;
return 0;
}