PAT L2-005. 集合相似度

题目链接:PAT L2-005. 集合相似度

题意:

给定两个整数集合,它们的相似度定义为:Nc/Nt*100%。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

题解:

对于给定的n预处理一下所有的情况,然后O(1)查询就行了,也可以直接set暴艹。

 
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=55;
 6 
 7 vector<int>Q[N];
 8 vector<int>::iterator it;
 9 int n,sz,x,t,a,b;
10 
11 double ans[55][55];
12 
13 int main()
14 {
15     scanf("%d",&n);
16     F(i,1,n)
17     {
18         scanf("%d",&sz);
19         F(j,1,sz)scanf("%d",&x),Q[i].push_back(x);
20         sort(Q[i].begin(),Q[i].end());
21         Q[i].erase(unique(Q[i].begin(),Q[i].end()),Q[i].end());
22     }
23     scanf("%d",&t);
24     F(i,1,n)ans[i][i]=100;
25     F(i,1,n)F(j,i+1,n)
26     {
27         int a=i,b=j;
28         int Nc=0,Nt;
29         if(Q[b].size()<Q[a].size())swap(a,b);
30         int sz=Q[a].size()-1;
31         F(k,0,sz)
32         {
33             it=lower_bound(Q[b].begin(),Q[b].end(),Q[a][k]);
34             if(it!=Q[b].end()&&*it==Q[a][k])Nc++;
35         }
36         Nt=Q[a].size()+Q[b].size()-Nc;
37         ans[i][j]=ans[j][i]=100.0*Nc/Nt;
38     }
39     F(i,1,t)
40     {
41         int a,b;
42         scanf("%d%d",&a,&b);
43         printf("%.2f%%
",ans[a][b]);
44     }
45     return 0;
46 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/6709478.html