您的位置:首页 > 其它

pta 集合相似度 (stl)

2017-03-18 21:17 197 查看
5-9 集合相似度   (25分)

给定两个整数集合,它们的相似度定义为:N_c / N_t \times
100\%N​c​​/N​t​​×100%。其中N_cN​c​​是两个集合都有的不相等整数的个数,N_tN​t​​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数NN(\le
50≤50),是集合的个数。随后NN行,每行对应一个集合。每个集合首先给出一个正整数MM(\le
10^4≤10​4​​),是集合中元素的个数;然后跟MM个[0,
10^9][0,10​9​​]区间内的整数。

之后一行给出一个正整数KK(\le
2000≤2000),随后KK行,每行对应一对需要计算相似度的集合的编号(集合从1到NN编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后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%


题意有点坑,nt就是两个数组里重复元素只保留一个后的元素个数,nc就是两个数组去重后相同元素的个数。

然后就是用set去做就行了,set会自动去重,且内部的find()函数就是二分的原理,时间复杂度很低。

当然二分也可以过

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
set <int>num[55];
set <int>::iterator it;
int main()
{
int m, n, j, i;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
int k, x;
scanf("%d", &k);
for(j=1; j<=k; j++)
{
scanf("%d", &x);
num[i].insert(x);
}
}
int t, x, y;
cin>>t;
while(t--)
{
scanf("%d%d", &x, &y);
double p, q;
p=q=0;
for(it=num[x].begin(); it!=num[x].end(); it++)
{
if(num[y].find(*(it))!=num[y].end())q++;
}
p=(int)num[x].size()+(int)num[y].size()-q;
printf("%.2lf%%\n", q/p*100);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: