zl程序教程

您现在的位置是:首页 >  前端

当前栏目

set的相关习题

set 相关 习题
2023-09-11 14:15:52 时间

问题 A: Set Similarity

http://codeup.cn/problem.php?cid=100000597&pid=0
在这里插入图片描述
在这里插入图片描述
题目说的是:先计算两个集合去重后的交集Nc,然后计算两个元素并集并去重Nt,两者相除。
例:

12 集合  交集有 87  101
并集有    99   87  101  5
2/4=0.5

13 集合  交集有 99   101
并集有    87  101   99  18   5  135   
2/6=1/3

思路就是求出 a 和 b 相重复的数的个数n
再用 a.size()+b.size()-n=并集的个数m
n/m

#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
set<int> s[200];
int main(void)
{
	int n;
	int m;
	int i,j;
	int number;
	cin>>n;
	j=0;
	while(n)
	{
		cin>>m;
		for(i=0;i<m;i++)
		{
			scanf("%d",&number);
			s[j].insert(number);
		}
		n--;
		j++; 
	}
	int w,a,b;
	set<int>::iterator it;
	cin>>w;
	while(w)
	{
		scanf("%d %d",&a,&b);
		int temp;
		int count=0;
		for(it=s[a-1].begin();it!=s[a-1].end();it++)
		{
			if(s[b-1].find(*it)!=s[b-1].end())//说明重复了 
			{
				count++;
			}
		}
		int ans=s[b-1].size()+s[a-1].size()-count;
		printf("%.1lf%%\n",100*(double)count/ans);
		w--;
	}
	return 0;
}