L2-005 集合相似度
Statement
Metadata
- 作者: 陈越
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 400 ms
- 内存限制: 64 MB
给定两个整数集合,它们的相似度定义为:
输入格式
输入第一行给出一个正整数
之后一行给出一个正整数
输出格式
对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。
输入样例
输出样例
Solution
#include <ctype.h>
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const double PI = 3.14159265358979323846264338327;
const double E = 2.718281828459;
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;
int main() {
set<int> s[51];
int n, num, k;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &num);
s[i].insert(num);
}
}
scanf("%d", &k);
int x, y;
for (int i = 0; i < k; i++) {
scanf("%d%d", &x, &y);
int nt = s[x].size() + s[y].size();
int nc = 0;
set<int>::iterator it;
for (it = s[x].begin(); it != s[x].end(); it++) {
if (s[y].count(*it))
nc++;
}
nt -= nc;
printf("%.2lf%%\n", nc * 1.0 / nt * 100);
}
}
Last update: May 4, 2022