题目链接:PAT A 1063
题目大意:输入第一行给出一个数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;
}