原题链接
解题思路
给定任意两个集合,求他们的 并集的元素个数/交集的元素个数。
利用STL中的unordered_set(去重但不排序,速度比set更快)可以很好的解决这题。
源代码
#include<iostream>
#include<unordered_set>
using namespace std;
const int maxn = 60;
//unordered_set<int> sets[maxn];
struct Set{
unordered_set<int> elements;
int num;
}sets[maxn],temp;
int main(){
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++){
int num,x;
scanf("%d",&num);
for(int j=0; j<num; j++){
scanf("%d",&x);
sets[i].elements.insert(x);
}
sets[i].num = sets[i].elements.size();
}
scanf("%d",&n);//n组查询
int a, b;
while(n--){
scanf("%d%d",&a,&b);
//把a集合元素都插入b集合,a集合元素个数 - b集合元素增长个数 = Nc
temp = sets[b];//注意为了后面的计算,不要更改原集合
for(unordered_set<int>::iterator it = sets[a].elements.begin(); it!=sets[a].elements.end(); it++){
temp.elements.insert(*it);
}
double Nc = sets[a].num - ( temp.elements.size() - sets[b].num );
//printf("Na:%d Nb:%d Ntemp:%d\n",sets[a].num, sets[b].num, temp.elements.size());
double Nt = temp.elements.size();
//printf("Nc:%d Nt:%d %.1f\%\n",Nc, Nt, (double)(100*Nc/Nt));
printf("%.1f\%\n",100*Nc/Nt);
}
return 0;
}