题目大意
给定两组整数,这组整数的相似度定义为N C / N t ×100%,其中N C 两组是共有的不同公共数的数量,N t 是两组中不同数字的总数。您的工作是计算任何给定组对的相似度。
- 举个栗子
3 99 87 101
4 87 101 5 87
Nc:87、101
Nt:5、87、99、101
相似度:2/4*100%=50.0%
题解分析
- 经过读题发现单个集合内的重复元素在计算上没有任何作用、因此可以直接使用set来进行存储数据。
- 在对两个set进行比较求解的时候,可以考虑使用set的遍历
- 在我的代码中比较了需要操作的两个数字的大小,是为了在一定程度上降低不必要的查找
- 最后注意int double类型的转换问题。
AC代码
#include<bits/stdc++.h>
using namespace std;
int numSet, numQue;
vector< set<int> > vecSet;
void computeSimilarity(int x, int y) {//计算两个集合之间的相似度
int size1 = vecSet[x].size();
int size2 = vecSet[y].size();
int sum = 0;//两个集合相同的数量
if (size1 < size2) {//遍历size1
set<int>::iterator iter,iter2;
for (iter = vecSet[x].begin(); iter != vecSet[x].end(); iter++) {
iter2 = vecSet[y].find(*iter);
if (iter2 != vecSet[y].end())
sum++;
}
}
else {
set<int>::iterator iter, iter2;
for (iter = vecSet[y].begin(); iter != vecSet[y].end(); iter++) {
iter2 = vecSet[x].find(*iter);
if (iter2 != vecSet[x].end())
sum++;
}
}
double res;
res = (sum * 100.0) / ((size1 + size2 - sum) * 1.0);
printf("%.1lf", res); cout << '%' << endl;
}
int main() {
cin >> numSet;
for (int i = 0; i < numSet; i++) {//数据读入
int tem;
cin >> tem;
set<int> mySet;
for (int j = 0; j < tem; j++) {
int nu;
cin >> nu;
mySet.insert(nu);
}
vecSet.push_back(mySet);
mySet.clear();
}
cin >> numQue;
for (int i = 0; i < numQue; i++) {
int x, y;
cin >> x >> y;
computeSimilarity(x-1, y-1);
}
return 0;
}