关键词:set , vector, STL
试题链接:
Set Similarity (25)
问题描述:
思路:
这道题很显然是要用集合set来解决的。
C++STL模板中的set(集合)有两个特点:
1.集合中没有重复元素。
2.集合内部是自动有序的。
对于集合求交并补常用的几个函数:
//求v[a] v[b]并集并将结果存放于一个vector u中
set_union(v[a - 1].begin(), v[a - 1].end(), v[b - 1].begin(), v[b - 1].end(), inserter(u, u.begin()));
//求v[a] v[b]交集并将结果存放于一个vector inter中
set_intersection(v[a - 1].begin(), v[a - 1].end(), v[b - 1].begin(), v[b - 1].end(), inserter(inter, inter.begin()));
//求v[a] v[b]差集并将结果存放于一个vector d中
set_difference(v[a - 1].begin(), v[a - 1].end(), v[b - 1].begin(), v[b - 1].end(), inserter(d, d.begin()));
备注:
这道题思路很简单,但是要注意一下输出格式是要保留小数点后一位小数的。
需要以下操作实现:
#include<iomanip>
cout <<fixed<<setprecision(1)<< rate << "%" << endl;
解决方案:
#include<iostream>
#include<iomanip>
#include<set>
#include<vector>
#include <algorithm>
using namespace std;
int main() {
int N, M, num, K;
//存放集合的变长数组
vector< set<int> > v;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> M;
set<int> tmp;
for (int j = 0; j < M; j++) {
cin >> num;
tmp.insert(num); //向集合中插入数
}
v.push_back(tmp);
}
cin >> K;
for (int i = 0; i < K; i++) {
int a, b;
cin >> a >> b;
vector< int > u; //存放并集
vector< int > inter; //存放交集
set_union(v[a - 1].begin(), v[a - 1].end(), v[b - 1].begin(), v[b - 1].end(), inserter(u, u.begin()));
set_intersection(v[a - 1].begin(), v[a - 1].end(), v[b - 1].begin(), v[b - 1].end(), inserter(inter, inter.begin()));
float rate=float(inter.size()) / float(u.size()) * 100;
cout <<fixed<<setprecision(1)<< rate << "%" << endl;
}
return 0;
}