https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608

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

输入格式:

输入第一行给出一个正整数N(≤),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤),是集合中元素的个数;然后跟M个[区间内的整数。

之后一行给出一个正整数K(≤),随后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%

时间复杂度:$O(N * K * log(M))$

题解:二叉搜索树 用 $set$ 容器

代码:

#include <bits/stdc++.h>
using namespace std; int n;
set<int> u[55]; void f(int a,int b) {
int same = 0;
set<int>::iterator it;
for(it = u[a].begin(); it != u[a].end(); it ++){
if(u[b].find(*it) != u[b].end())
same ++;
}
int sum = u[a].size() + u[b].size();
int cnt = sum - same;
printf("%.2lf", same * 1.0 / cnt * 100);
cout<<"%"<<endl;
} int main(){
scanf("%d", &n);
int k;
int a;
int m;
for(int i = 1; i <= n; i ++) {
scanf("%d", &k);
for(int j = 1; j <= k; j ++) {
scanf("%d", &a);
u[i].insert(a);
}
}
scanf("%d", &m);
int b;
for(int i = 1; i <= m; i ++){
scanf("%d%d", &a, &b); f(a,b);
}
}

  

最新文章

  1. 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
  2. D3.js学习记录
  3. HDU1434(终于用优先队列a了一题。。。了解度+1)
  4. vyatta常用操作
  5. Gunicorn 文档翻译
  6. 初学者:JSP登陆界面
  7. [转]hadoop hdfs常用命令
  8. MIB-II
  9. win7+ubuntu双系统安装方法
  10. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】
  11. Java 8 Nashorn JavaScript
  12. authenticate验证的流程
  13. 【mac环境】终端配色 &amp; 配置使用ll命令
  14. 如何通过automator创建自动化备份任务?
  15. c语言基本数据类型及存储方式
  16. 【教程向】——基于hexo+github搭建私人博客
  17. Red Hat Enterprise Linux AS release 4 yum源
  18. Android O seLinux 编译错误
  19. 使用WrapPanel和DockPanel
  20. [BZOJ4204] 取球游戏(期望)

热门文章

  1. Linux字符设备驱动--No.2
  2. ISAP学习笔记
  3. 串口UART学习笔记(一)
  4. 自己用原生JS写的轮播图,支持移动端触屏滑动,面向对象思路。分页器圆点支持click和mouseover。
  5. springBoot整合ecache缓存
  6. AS 3.1 项目打包成jar或aar
  7. Prism(WPF) 拐着尝试入门
  8. CLR via c#读书笔记五:方法
  9. Matlab2018年最新视频教程视频讲义(包含代码)
  10. Fiddler使用总结(二)