给定两个整数集合,它们的相似度定义为:Nc/Nt×100%。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入格式: 输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤10^4),是集合中元素的个数;然后跟M个 [0,10^9] 区间内的整数。 之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。输出格式: 对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。输入样例: 3 3 99 87 101 4 87 101 5 87 7 99 101 18 5 135 18 99 2 1 2 1 3 输出样例: 50.00% 33.33%题意解析 两个集合都有的不相等整数的个数:指的是两个集合的共有的元素。 两个集合一共有的不相等整数的个数:指的是两个集合的并集去重。
解题思路 我们可以直接使用set数组容器去存储每一个集合的数据,当我们需要计算第一个集合和第二个集合的相似度的时候,可以先遍历第一个集合中的每一个元素,然后再遍历第二个集合中的元素去寻找是否存在有第一个集合和第二个集合共有的元素,如果存在,则说明该元素是这两个集合的共同元素。
AC代码:
#include <iostream> #include <set> #include <stdio.h> using namespace std; set<int> s[100]; int main() { int n; cin>>n; int m,a; for(int i=1;i<=n;i++){ cin>>m; for(int j=1;j<=m;j++){ cin>>a; s[i].insert(a); //将集合中的数据存放到各自容器中 } } int z; cin>>z; for(int i=1;i<=z;i++){ int b,c; cin>>b>>c; int len1 = s[b].size(); //计算第一个集合长度 int len2 = s[c].size(); //计算第二个集合长度 int len3 = 0; //合计两个集合共有的个数 for(set<int>::iterator it = s[b].begin();it != s[b].end();it++){ if(s[c].find(*it)!=s[c].end()) //找到两个集合共有的 len3++; } printf("%.2lf%%\n",len3*1.0/(len1+len2-len3)*100); } return 0; }STL-SET 知识回顾
