1063 Set Similarity
Posted kkmjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1063 Set Similarity相关的知识,希望对你有一定的参考价值。
题意:求两个集合的相似性。
思路:考察set。会用set题目就很简单。不过这里要拓展一下,求交集求并集的函数。见最后。
代码:
#include <cstdio> #include <vector> #include <set> #include <algorithm> using namespace std; int main() { freopen("pat.txt","r",stdin); int n,m,val; scanf("%d",&n); vector<set<int>> st(n+1); for(int i=1;i<=n;i++){ scanf("%d",&m); while(m--){ scanf("%d",&val); st[i].insert(val); } } int q,u,v; scanf("%d",&q); while(q--){ scanf("%d%d",&u,&v); set<int> set_u=st[u]; set<int> set_v=st[v]; int nc=0; for(auto i:set_u) if(set_v.find(i)!=set_v.end()) nc++; double rate=100*(double)nc/(set_u.size()+set_v.size()-nc); printf("%.1f\% ",rate);//输出%要加个转义字符"" } return 0; }
STL中有求两个集合的函数,在头文件<algorithm>(这里的"集合"不一定非得是set,也可以是vector,string等,但是前提是有序),set_intersection,set_union,用法如下:
#include <cstdio> #include <vector> #include <set> #include <algorithm> using namespace std; int main() { set<int> a={1,2,3}; set<int> b={3,4,1}; set<int> jiaoji,bingji;//蜜汁命名~ set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(jiaoji,jiaoji.begin()));//注意最后一个参数的写法 for(auto i:jiaoji) printf("%d ",i);//输出1 3 printf(" "); set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(bingji,bingji.begin())); for(auto i:bingji) printf("%d ",i);//输出1 2 3 4 printf(" "); vector<int> u={1,3,2,4}; vector<int> v={4,2,3,5}; vector<int> vecJiao,vecBing; //要先确保容器里元素是有序的,还必须是升序的,若不是有序的或升序的,程序也能运行,但结果不是如我们想的那样的! sort(u.begin(),u.end()); sort(v.begin(),v.end()); set_intersection(u.begin(),u.end(),v.begin(),v.end(),inserter(vecJiao,vecJiao.begin())); for(auto i:vecJiao) printf("%d ",i);//输出2 3 4 printf(" "); set_union(u.begin(),u.end(),v.begin(),v.end(),inserter(vecBing,vecBing.begin())); for(auto i:vecBing) printf("%d ",i);//输出1 2 3 4 5 printf(" "); return 0; }
以上是关于1063 Set Similarity的主要内容,如果未能解决你的问题,请参考以下文章