L2-005 集合相似度 (25 分)
解题思路
第一遍用数组存的,最后的除数被除数是用set存的,有一部分没过。
看了大佬的解题思路之后,是一开始就用set存的,除数被除数的计算是这样的
set<int>::iterator it;
for(it=nn[a1].begin();it!=nn[a1].end();it++)
if(nn[a2].find(*it) != nn[a2].end())
jiao++;
第一次用,但是set确实很好用。STL都很实用
完整代码
#include<iostream>
#include<set>
using namespace std;
int main()
{
int N;
cin>>N;
set<int>nn[55];
for(int i=1;i<=N;i++)
{
int n;
cin>>n;
for(int j=1;j<=n;j++)
{
int x;
cin>>x;
nn[i].insert(x);
}
//cout<<nn[i].size()<<endl;
}
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a1,a2;
cin>>a1>>a2;
int jiao=0,bin=0;
set<int>::iterator it;
for(it=nn[a1].begin();it!=nn[a1].end();it++)
if(nn[a2].find(*it) != nn[a2].end())
jiao++;
double x=jiao*1.0/((nn[a1].size()+nn[a2].size()-jiao)*1.0);
x*=100;
printf("%.2f",x);
cout<<"%"<<endl;
}
}