题目链接: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 }