题目链接
解题思路:
set的应用 我傻了 我居然一开始用 set + vector 写的 然后最后一个样例超时了
代码如下(错得):
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e4+10;
vector<int> a[maxn];
set<int> s;
set<int> ss;
set<int> sss;
int b[maxn];
int main()
{
int n,m,i,j;
int k,x,y;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>m;
b[i]=m;
while(m--)
{
cin>>x;
a[i].push_back(x);
}
}
cin>>k;
int ans=0;
int sum=0;
while(k--)
{
cin>>x>>y;
ans=0;
sum=0;
s.clear();
ss.clear();
sss.clear();
for(i=0;i<b[x];i++)
s.insert(a[x][i]);
for(i=0;i<b[y];i++)
{
if(s.count(a[y][i])!=0)
ss.insert(a[y][i]);
else
sss.insert(a[y][i]);
}
ans=ss.size();
sum=s.size()+sss.size();
double num=(double)ans*100/(double)sum;
printf("%.2lf%\n",num);
}
return 0;
}
代码如下(正解):
#include<iostream>
#include<set>
using namespace std;
const int maxn=1e4+10;
set<int> a[maxn];
int main()
{
int n;
int k,m,i,j,ans;
int x,y;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>m;
while(m--)
{
cin>>x;
a[i].insert(x);
}
}
cin>>k;
while(k--)
{
cin>>x>>y;
ans=0;
for(set<int>::iterator it=a[x].begin();it!=a[x].end();it++)
{
if(a[y].count(*it))
ans++;
}
printf("%.2lf%\n",(double)ans*100/(double)(a[x].size()+a[y].size()-ans));
}
return 0;
}