1.该题目主要是先输入一些集合,然后查询某两个集合的交集数量除以并集数量
2.刚开始使用map去存储每个集合,后面再建立一个新的map合并两个集合的map,从而查找交集数量,结果超时
3.后面改为利用map作集合的重复判断,在输入集合时,通过map的判断,建立一个每个元素都是唯一的vector
4.合并时,直接申请两个集合数量总和大小的新vector,把两个集合的vector复制进去,然后进行排序,通过检测元素是否出现两次,来实现检测交集
5.新vector的size减去交集大小,就是并集
6.通过这种数据结构和方法,成功AC题目
AC代码:
//#include<string>
//#include<stack>
//#include<unordered_set>
//#include <sstream>
//#include "func.h"
//#include <list>
#include <iomanip>
#include<unordered_map>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include <algorithm>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
#include<stack>
using namespace std;
int main(void)
{
int total;
scanf("%d", &total);
vector<map<int, int>> m(total);
vector<vector<int>> ele(total);
for (int i = 0; i < total; i++)
{
int n;
scanf("%d", &n);
for (int j = 0; j < n; j++)
{
int tmp;
scanf("%d", &tmp);
if (m[i][tmp] == 0)
{
m[i][tmp] = 1;
ele[i].push_back(tmp);
}
}
}
int querySum;
scanf("%d", &querySum);
for (int i = 0; i < querySum; i++)
{
int a;
int b;
scanf("%d %d", &a, &b);
a--;
b--;
vector<int> cal(ele[a].size() + ele[b].size());
for (int i = 0; i < ele[a].size(); i++)
{
cal[i] = ele[a][i];
}
for (int i = ele[a].size(); i < ele[a].size() + ele[b].size(); i++)
{
cal[i] = ele[b][i - ele[a].size()];
}
double same = 0;
sort(cal.begin(), cal.end());
for (int i = 0; i < cal.size()-1; i++)
{
if (cal[i] == cal[i + 1])
same++;
}
double ans = same / (cal.size() - same) * 100;
printf("%.1lf%\n", ans);
}
return 0;
}