PAT A1063 Set Similarity
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%
-
思路 1:
将待查询的两个set中所有元素插入一个新的set中去,因为两个set本身已经是去过重的了,再插入test中减少的元素个数,就是两个set共同的部分(交集Nc),插入完成后test的大小,就是两个set全部重复元素的个数(并集Nt). -
code 1:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <unordered_set> //!!!:Wrong 1:
using namespace std;
unordered_set<int> se[110], test;
int main(){
int n, nS, tmp, q;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &nS);
for(int j = 0; j < nS; ++j){
scanf("%d", &tmp);
se[i].insert(tmp);
}
}
scanf("%d", &q);
for(int i = 0; i < q; ++i){
int q1, q2, len1, len2;
scanf("%d %d", &q1, &q2);
len1 = se[q1].size();
len2 = se[q2].size();
test.clear();
for(auto it = se[q1].begin(); it != se[q1].end(); ++it){
test.insert(*it);
}
for(auto it = se[q2].begin(); it != se[q2].end(); ++it){
test.insert(*it);
}
int Nt = test.size();
int Nc = len1+len2-Nt;
printf("%.1f", (double)Nc/(double)Nt * 100.0);
printf("%\n");
}
return 0;
}
-
Wrong 1:
用set会超时,改为unordered_set -
思路 2:
找共同元素,改为遍历一个set,找是否有另一个中的元素,并集为 总大小 - 交集大小(或者在遍历中直接用一个变量累加) -
code 2:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <unordered_set>
using namespace std;
unordered_set<int> se[110];
void compare(int a, int b){
int len1 = se[a].size(), len2 = se[b].size();
//在小的里面找大的,默认为a小,如果b小将now 改为b
int now = a, other = b, Nc = 0, Nt = len1+len2;
if(len2 < len1){
now = b;
other = a;
}
for(auto it = se[now].begin(); it != se[now].end(); ++it){
if(se[other].find(*it) != se[other].end()) Nc++;
}
Nt -= Nc;
printf("%.1f%\n", (double)Nc/(double)Nt * 100.0);
}
int main(){
int n, nS, tmp, q;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &nS);
for(int j = 0; j < nS; ++j){
scanf("%d", &tmp);
se[i].insert(tmp);
}
}
scanf("%d", &q);
for(int i = 0; i < q; ++i){
int q1, q2, len1, len2;
scanf("%d %d", &q1, &q2);
compare(q1, q2);
}
return 0;
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
unordered_set<int> st[maxn];
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
int cnt_st, tmp;
scanf("%d", &cnt_st);
for(int j = 0; j < cnt_st; ++j){
scanf("%d", &tmp);
st[i].insert(tmp);
}
}
scanf("%d", &n);
for(int i = 0; i < n; ++i){
int cnt_q, tmp_q1, tmp_q2;
scanf("%d %d", &tmp_q1, &tmp_q2);
int Nc = 0, Nt = st[tmp_q2].size();
for(auto it = st[tmp_q1].begin(); it != st[tmp_q1].end(); ++it){
if(st[tmp_q2].find(*it) != st[tmp_q2].end()) Nc++;
else Nt++;
}
printf("%.1f%\n", 100.0 * Nc / Nt);
}
return 0;
}