- 之前用calculate的时候超时了,我觉得是因为复制操作太多,以及插入删除操作也很多,导致很耗时,而相比之下用平衡二叉树来实现的set,find操作是对数复杂度的,所以calculate2的方法通过循环s2在是中find然后更改相同元素和总非相同元素的计数更快
#include <iostream>
#include <set>
#include <iomanip>
using namespace std;
double calculate(set<int> s1,set<int> s2)
{
set<int> ts=s1;
int num=s1.size();
for(set<int>::iterator i=s2.begin();i!=s2.end();++i){//迭代器不支持小于号
ts.insert(*i);
s1.erase(*i);
}
double sum=ts.size();
double same=num-s1.size();
return same*1.0/sum;
}
double calculate2(set<int> &s1,set<int> &s2)
{
double same=0;
double sum=s1.size();
for(set<int>::iterator i=s2.begin();i!=s2.end();++i){
if(s1.find(*i)!=s1.end())
++same;
else
++sum;
}
return same*1.0/sum;
}
set<int>* setp[51];//存指向集合的指针下标从1开始
int main()
{
int n;cin>>n;
for(int i=1;i<=n;++i){
int num;cin>>num;
setp[i]=new set<int>();
int x;
for(int j=1;j<=num;++j){
cin>>x;
(*(setp[i])).insert(x);
}
//一开始携程set s s.insert setp[i]=&s输出来就很奇怪
}
int opn;cin>>opn;
for(int i=0;i<opn;++i){
if(i)
cout<<endl;
int n1,n2;
cin>>n1>>n2;
cout<<setprecision(2)<<setiosflags(ios::fixed)<<calculate2(*(setp[n1]),*(setp[n2]))*100<<'%';
}
return 0;
}
网友评论