PAT:1063. Set Similarity (25) AC
#include<stdio.h>
#include<set>
using namespace std;
set<int> str[51]; //最大51个集合
void compare(int s1,int s2)
{
int different=str[s1].size(),same=0; //初始化并集元素为s1元素个数,交集元素0个
for(set<int>::iterator it=str[s2].begin() ; it!=str[s2].end() ; ++it ) //【skill】迭代器it指向s2开始处,加到结尾处结束
if(str[s1].find(*it)!=str[s1].end()) //【skill】迭代器it指向位置的内容在s1中的坐标
++same; //【skill】不是结尾,就表明找到(此处结尾是不可达的,end是s1最后一个元素的下一个位置)
else
++different; //是s1结尾,表明找不到,这个元素不同
printf("%.1f%%\n",(double)same/(double)different*100);
}
int main()
{
int n; //n个集合
scanf("%d",&n);
for(int i=1 ; i<=n ; ++i)
{
int k=0;
scanf("%d",&k);
for(int j=0 ; j<k ; ++j)
{
int tmp;
scanf("%d",&tmp);
str[i].insert(tmp);
}
}
int q;
scanf("%d",&q);
for(int i=0 ; i<q ; ++i)
{
int s1,s2;
scanf("%d%d",&s1,&s2);
compare(s1,s2);
}
return 0;
}