写在前面

  • 实现思路
  • 理解题意(开始有点儿懵逼)
  • 定义集合数组,​​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()))