青藤 210764 相似的数集
思路:第一个是两个数集的共有数字,第二个是两个数集的所有数字,两个都不能出现重复数字,然后除起来*100在添上一个%,建一个set数组,然后插入进去,接着在输入时找到x和y对应的数组数集,把x的元素全部遍历,然后y数集有就计数,第一个就是计数器的值,第二个就是两数集长度和-重复部分(即为计数器的值),然后依次输出,当然也可以把两个数集合并(因为集合可去重),然后以此类推,不过会超时
代码:
1.100分
#include<bits/stdc++.h>
using namespace std;
set<int>a[51];
int n,m,i,j,x,y,lx,ly,cnt;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(i=1;i<=n;i++){
cin>>m;
for(j=0;j<m;j++){
cin>>x;
a[i].insert(x);
}
}
cin>>m;
while(m--){
cin>>x>>y;
lx=a[x].size();
ly=a[y].size();
cnt=0;
for(set<int>::iterator it=a[x].begin();it!=a[x].end();++it)
if(a[y].find(*it)!=a[y].end())
cnt++;
printf("%.2lf%%\n",cnt*100.0/(lx+ly-cnt));
}
return 0;
}
2.40分
#include<bits/stdc++.h>
using namespace std;
set<int>a[51],b;
int n,m,i,j,k,x,y,lx,ly,lb;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(i=1;i<=n;i++){
cin>>m;
for(j=0;j<m;j++){
cin>>x;
a[i].insert(x);
}
}
cin>>k;
while(k--){
cin>>x>>y;
lx=a[x].size();
ly=a[y].size();
set<int>::iterator it=a[x].begin();
for(;it!=a[x].end();++it)b.insert(*it);
for(it=a[y].begin();it!=a[y].end();++it)b.insert(*it);
lb=b.size();
printf("%.2lf%%\n",(lx+ly-lb)*1.0/lb*100);
b.clear();
}
return 0;
}