PAT A1063——set的常见用法详解

set 常用函数实例

set是一个内部自动有序且不含重复元素的容器

(1)insert()

(2)find()  st.find(*it) 找到返回其迭代器,否者返回st.end()

(3)size()

(4)clear():清空所有元素

(5)erase():erase(st.begin()+3)删除第四个元素;erase(first,last)删除【first,last)内所有元素;
(6)如果set内定义的是结构体,需要重载<运算符
typedef struct Car {
int id;
int numForward;
int maxLayer;
double packetLoss;
}Car;
bool operator<(const Car &x,const Car &y) {
    return x.id < y.id;
}
1063 Set Similarity

Given two sets of integers, the similarity of the sets is defined to be Nc​​/Nt​​×100%, where Nc​​ is the number of distinct common numbers shared by the two sets, and Nt​​ 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 N (50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (104​​) and followed by M integers in the range [0,109​​]. After the input of sets, a positive integer K (2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). 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:

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:

50.0%
33.3%

题意:
  给出N个集合,给出的集合中可能含有相同的值。然后要求M个查询,每个查询给出两个集合的编号X和Y,求集合X和集合Y的相同元素率,即两个集合的交集和并集(均需去重)的元素个数的比率
参考代码:
 1 #include<cstdio>
 2 #include<set>
 3 using namespace std;
 4 const int N  = 51;
 5 set<int> st[N];     //N个集合
 6 void compare(int x, int y) {    //比较集合st[x]和集合st[y]
 7     int totalNum = st[y].size(), sameNum = 0;   //不同数的个数,相同数个个数
 8     //遍历集合st[x]
 9     for(set<int>::iterator it = st[x].begin(); it != st[x].end(); it++) {
10         if(st[y].find(*it) != st[y].end()) sameNum++;   //在st[y]中找到相同该元素
11         else totalNum++;    //在st[y]中找不到相同元素
12     }
13     printf("%.1f%%
", 100 * (double)sameNum/totalNum);     //输出比率
14 }
15 
16 int main(){
17     int n,k,q,v,st1,st2;
18     scanf("%d", &n);    //集合个数
19     for(int i = 1; i <= n; i++) {
20         scanf("%d", &k);    //集合i中的元素个数
21         for(int j = 0; j < k; j++) {
22             scanf("%d", &v);    //集合i中的元素v
23             st[i].insert(v);    //将元素v加入集合st[i]中
24         }
25     }
26     scanf("%d", &q);    //q个查询
27     for(int i = 0; i < q; i++) {
28         scanf("%d%d", &st1, &st2);  //欲对比的集合编号
29         compare(st1, st2);  //比较两个集合
30     }
31     return 0;
32 }

原文地址:https://www.cnblogs.com/mxj961116/p/10348228.html