PAT甲级 1063 Set Similarity (25分)

1063 Set Similarity (25分)

题目链接:PAT A 1063
PAT甲级 1063 Set Similarity (25分)_第1张图片
题目大意:输入第一行给出一个数n,代表集合的个数,随后n行每行给出一个集合的元素个数,以及集合中的数字。然后给出k次查询,要求求出指定两个集合的相同元素率nc/nt*100%,其中nc是指两个集合共有的不同元素的个数(说白了就是在去重之后求交集),nt是指两个集合总的不同元素的个数(说白了就是在去重之后求并集),之后保留到小数点后一位输出即可。
例如样例1:
集合1和集合2都有87,101,所以nc为2
集合1和集合2所有不同元素为99,87,101,5,所以nt为4

样例2:
集合1和集合3都有99,101,所以nc为2
集合1和集合3所有不同元素为99,87,101,5,18,135,所以nt为6

思路分析:题目中提示的已经很明确了,这道题可以用STL中的set解决。因为set会对它里面的元素自动递增排序并且自动去重(这道题用到去重)。把输入的集合分别存储起来,之后对于每一次查询,假设查询集合a和b,首先把nt定义为集合b中元素个数(输入时候set容器已经对每个集合自动去重过了),之后遍历集合a,用find函数查找集合a中元素是否也在集合b中,如果不在,就使nt加一,如果在,说明是共有元素,使nc加一(nc初值为0),最后输出比值即可。

AC代码:

#include
#include
using namespace std;
int main() {
	int n, cnt, temp, k, a, b;
	scanf("%d", &n);
	set<int> s[51];
	for(int i = 1; i <= n; i++) {
		scanf("%d", &cnt);
		for(int j = 0; j < cnt; j++) {
			scanf("%d", &temp);
			s[i].insert(temp); //set会自动去重 
		}
	}
	scanf("%d", &k);
	for(int i = 0; i < k; i++) {
		scanf("%d %d", &a, &b);
		int nc = 0, nt = s[b].size();
		for(auto it = s[a].begin(); it != s[a].end(); it++) {
			if(s[b].find(*it) != s[b].end()) //集合a中的元素也在集合b中,说明是共有元素 
				nc++;
			else //集合a中元素不在集合b中 
				nt++;
		}
		printf("%.1f%\n", nc * 1.0 / nt * 100);
	}
	return 0;
}

你可能感兴趣的:(PAT甲级题解)