set用法遍历-集合相似度

L2-005 集合相似度 (25 分)
 

给定两个整数集合,它们的相似度定义为:/。其中Nc​​是两个集合都有的不相等整数的个数,Nt​​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数N(≤),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤),是集合中元素的个数;然后跟M个[区间内的整数。

之后一行给出一个正整数K(≤),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:

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用法,set可以自动去重。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll nl=1e5+5;
set<ll>st[60];//定义一个set数组(看成二维数组)
int main(){
ll n;
cin>>n;
ll i,j;
i=0;
while(n--){
ll k;
cin>>k;
ll m;
for(j=0;j<k;j++){
cin>>m;
st[i].insert(m);//插入数据
}
i++;
}
ll ml;
cin>>ml;
while(ml--){
ll a,b;
cin>>a>>b;
ll num=0;
for(set<ll>::iterator it=st[a-1].begin();it!=st[a-1].end();++it){//set遍历(auto自家编译器通过不了)
if(st[b-1].count(*it)>0){//it为指针
num++;
}
}
printf("%.2f%\n",(num)*1.0/(st[a-1].size()+st[b-1].size()-num)*1.0*100.0);
}
}

 
posted @ 2021-04-14 11:01  yyscn  阅读(171)  评论(0)    收藏  举报