写在前面
- 实现思路
- 理解题意(开始有点儿懵逼)
- 定义集合数组,
set<int> st[maxn]
- 读取数据至对应集合中,通过集合下标对计算所求集合之间相似比
- 元素级比较
-
STL
函数比较
- 题目较为简单,理解题意耗费部分时间
- a题时间建议20分钟
测试用例
input:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
output:
50.0%
33.3%
ac代码
- 算法笔记
#include <set>
#include <cstdio>
#include <iostream>
using namespace std;
const int n = 51;
set<int> st[n];
void compare(int x, int y)
{
int totalNum = st[y].size(), sameNum = 0;
for(set<int>::iterator it=st[x].begin(); it!=st[x].end(); it++)
{
if(st[y].find(*it) != st[y].end()) sameNum++;
else totalNum++;
}
printf("%.1f%\n", sameNum*100.0/totalNum);
}
int main()
{
int n, k, q, v, st1, st2;
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", &k);
for(int j=0; j<k; j++)
{
scanf("%d", &v);
st[i].insert(v);
}
}
scanf("%d", &q);
for(int i=0; i<q; i++)
{
scanf("%d%d", &st1, &st2);
compare(st1, st2);
}
return 0;
}
-
改造代码(STL)
#include <set>
#include <iostream>
#include <algorithm>
using namespace std;
const int n = 51;
set<int> st[n];
void compare(int x, int y)
{
set<int> same;
set_intersection(st[x].begin(), st[x].end(), st[y].begin(), st[y].end(), inserter(same, same.begin()));
int sameNum = same.size(), totalNum = st[x].size() + st[y].size() - sameNum;
printf("%.1f%\n", sameNum*100.0/totalNum);
}
int main()
{
int n, k, query, integ, set_x, set_y;
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", &k);
for(int j=0; j<k; j++)
{
scanf("%d", &integ);
st[i].insert(integ);
}
}
scanf("%d", &query);
for(int i=0; i<query; i++)
{
scanf("%d%d", &set_x, &set_y);
compare(set_x, set_y);
}
return 0;
}
知识点小结
// set元素间比较 1
for(set<int>::iterator it=st[x].begin(); it!=st[x].end(); it++)
{
if(st[y].find(*it) != st[y].end()) sameNum++;
}
// set元素间比较2
#include<algorithm>
set<int> same;
set_intersection(st[x].begin(), st[x].end(), st[y].begin(), st[y].end(),inserter(same,same.begin()))