0%

PAT A1063 Set Similarity

题目链接

最后一个测试点超时

原因

求两个集合不同的个数时,不要新建一个集合,然后都插入进去!

代码

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
31
32
33
34
35
36
37
38
39
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
const int N=55;
const int M=1e4+10;

set<int> sets[N];
bool flag[M]={false};
int main(){
int n,m,x,k,s1,s2;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
for(int j=0;j<m;j++){
scanf("%d",&x);
sets[i].insert(x);
}
}
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%d",&s1,&s2);
//遍历s1集合,判断在s2中是否存在,求相同数的个数
double nc=0,nt=0,ans;
set<int> set_sum;
for(auto it=sets[s1].begin();it!=sets[s1].end();it++){
if(sets[s2].find((*it))!=sets[s2].end()) nc++;
}
//使用这个导致超时!!!
set_sum.insert(sets[s1].begin(),sets[s1].end());
set_sum.insert(sets[s2].begin(),sets[s2].end());
nt=set_sum.size();
ans=nc/nt*100;
printf("%.1f%\n",ans);
}
return 0;
}

AC解法

思路

求解两个集合中不同的集合,就是一个集合的总数加上另一个集合中与该集合不同的个数!!!

代码

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
31
32
33
34
35
36
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
const int N=55;
const int M=1e4+10;

set<int> sets[N];
bool flag[M]={false};
int main(){
int n,m,x,k,s1,s2;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
for(int j=0;j<m;j++){
scanf("%d",&x);
sets[i].insert(x);
}
}
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%d",&s1,&s2);
//遍历s1集合,判断在s2中是否存在,求相同数的个数
double nc=0,nt=sets[s2].size(),ans;
set<int> set_sum;
for(auto it=sets[s1].begin();it!=sets[s1].end();it++){
if(sets[s2].find((*it))!=sets[s2].end()) nc++;//不等于end说明s2中存在
else nt++;
}
ans=nc/nt*100;
printf("%.1f%\n",ans);
}
return 0;
}

本文标题:PAT A1063 Set Similarity

文章作者:GavinYGM

发布时间:2020年09月11日 - 22:09

最后更新:2020年09月11日 - 22:09

原始链接:http://www.gavinygm.cn/2020/09/11/PAT-A1063-Set-Similarity/

许可协议: 转载请保留原文链接及作者。