Python中求集合的交集并集是十分方便了,但在C++中还是有困难的。
set里面有set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)、set_symmetric_difference(取集合对称差集)等函数。共有5个参数,前4个参数一样分别是集合a.begin(),end和b.begin,end。
第5个参数是保存的位置或者直接输出。
- 保存到set或vector: 将集合A、B取合集后的结果存入集合C中
1 |
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(C1 , C1.begin())); |
- 输出: 将A、B取合集后的结果直接输出,(cout," ")双引号里面是输出你想用来间隔集合元素的符号或是空格。
1 |
set_union(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator<int>(cout," “)); |
注意有些编译器需要导入
例题 PAT 甲 1063 Set Similarity (25 分)
Given two sets of integers, the similarity of the sets is defined to be , where is the number of distinct common numbers shared by the two sets, and is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.
Input Specification:
Each input file contains one test case. Each case first gives a positive integer () which is the total number of sets. Then lines follow, each gives a set with a positive () and followed by integers in the range []. After the input of sets, a positive integer () is given, followed by lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to ). All the numbers in a line are separated by a space.
Output Specification:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.
Sample Input:
1 2 3 4 5 6 7 8 |
3 3 99 87 101 4 87 101 5 87 7 99 101 18 5 135 18 99 2 1 2 1 3 |
Sample Output:
1 2 3 |
50.0% 33.3% |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include<bits/stdc++.h> using namespace std; set<int> s1; set<int> s2; int main(){ int num, t, x; cin>>num; vector<set<int> > pool(num+1); for(int i = 0; i < num; i++){ cin>>t; while(t--){ cin>>x; pool[i].insert(x); } } int check; cin>>check; while(check--){ int a, b; cin>>a>>b; vector<int> ANS1; vector<int> ANS2; set_union(pool[a-1].begin(),pool[a-1].end(),pool[b-1].begin(),pool[b-1].end(), inserter(ANS1,ANS1.begin())); set_intersection(pool[a-1].begin(),pool[a-1].end(),pool[b-1].begin(),pool[b-1].end(), inserter(ANS2,ANS2.begin())); printf("%.1f%%\n", ANS2.size()*1.0/ANS1.size()*100); } return 0; } |