基本思想:
自己的方法是直接用set记录,直接遍历两个一起添加得笨办法,但是示例代码中的值得学习;
关键点:
集合并集交集思想,可以直接记录第一个set得数目,直接遍历第二个;
如果在使用第一个set.find,找到相同元素,直接记录交集数目+1;找到不同元素,则交集元素+1;
double charge(int a, int b) { double jn=0, bn=0; bn = vec[a].size(); for (auto it = vec[b].begin(); it != vec[b].end(); it++) { if (vec[a].find(*it) != vec[a].end()) { //如果找到相同元素; jn++; } else { bn++; } } return jn/bn; }
总体代码:
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> #include<map> #include<queue> #include<set> using namespace std; int n,m; vector<set<int>>vec; double charge(int a, int b) { double jn=0, bn=0; bn = vec[a].size(); for (auto it = vec[b].begin(); it != vec[b].end(); it++) { if (vec[a].find(*it) != vec[a].end()) { //如果找到相同元素; jn++; } else { bn++; } } return jn/bn; } int main() { scanf("%d", &n); int a,b; for (int i = 0; i < n; i++) { set<int>s; scanf("%d", &a); for (int j = 0; j < a; j++) { scanf("%d", &b); s.insert(b); } vec.push_back(s); } scanf("%d", &m); for (int i = 0; i < m; i++) { scanf("%d %d", &a, &b); double re = charge(a - 1, b - 1)*100; //cout << re << endl; printf("%.1lf%%\n", re); } return 0; }