题目描述
给出两个数集,它们的相似程度定义为 Nc/Nt×100。其中,Nc 表示两个数集中相等的、两两互不相同的元素个数,而 Nt 表示两个数集中总共的互不相同的元素个数。请计算任意两个给出数集的相似程度。
输入
第一行一个正整数 N(N≤50),表示数集的个数。
接下来的 N 行,每行首先给出一个正整数 M(M≤10000),之后给出的 M 个正整数为此数集中的元素(可能有重复,小于或等于 10^6)。
在这些数集之后,给出一行一个正整数 K(K≤2000) 表示询问的个数。
之后的 K 行,每行两个正整数 x 和 y,表示询问 x 数集与 y 数集的相似程度。每一行中输入的各个整数之间由一个空格隔开。
输出
对于每一个询问,输出一行一个百分数,为两个数集的相似程度,保留一位小数。
样例输入
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
样例输出
50.00%
33.33%
我的代码:
//set <int> s
//s.begin()//返回 s 的第一个元素位置
//s.count(w)//返回集合中w的数量
//s.end()返回 s 的最后一个元素位置
//s.empty()//检查容器是否为空
//s.size()//返回元素数
//s.insert(w)//向容器中插入 w 这个元素
//s.erase(w)//在容器中删除 w 这个元素
//s.clear()//将 s 清空
//swap(s1,s2)//交换 s1 与 s2 两个容器内的元素
//s.find(w)//在容器中查找 w 这个元素所在的位置
//s.lower_bound(w)//在容器中寻找第一个不小于 w 的元素位置
//遍历set:for(set<int>::iterator it=s.begin();it!=s.end();it++) ,使用时一般为*it
#include<bits/stdc++.h>
using namespace std;
int n,m,t,k,x,y;
set <int> s[105];
int main(){
// freopen("set.in","r",stdin);
// freopen("set.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
while(m--){
scanf("%d",&t);
s[i].insert(t);
}
}
scanf("%d",&k);
while(k--){
scanf("%d%d",&x,&y);
int lenx=s[x].size(),leny=s[y].size(),sum=0;
for(set<int>::iterator it=s[x].begin();it!=s[x].end();it++)if(s[y].count(*it))sum++;
printf("%.2f",1.0*sum*100/(lenx+leny-sum));
printf("%\n");
}
// fclose(stdin);fclose(stdout);
return 0;
}
TLE27分