描述
输入:
输出:
对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。
思路
:同一集合内相同的数据是无用的,我们直接用set处理掉,对于每两个给出的集合,先找出相同的数据,再用总数减去相同的既是一共有的
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e4+10; map<int,set<int>>mp; int n,cnt,t,m; int a,b; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>cnt; for(int j=1;j<=cnt;j++) { cin>>t; mp[i].insert(t); } } cin>>m; for(int i=1;i<=m;i++) { cin>>a>>b; double ss=0,st=0; for(auto k : mp[a]) { if(mp[b].count(k)==1) { ss++; } }//找出两个集合都有的 st=mp[a].size()+mp[b].size()-ss;//一共有的即是总数减去重复的 printf("%.2lf",ss/st*100); cout<<"%"<<endl; } }
反思:
vector没有查找函数,使用set更加方便和省力