pta L2-005 集合相似度

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608

评价:怪我眼下,把集合调成了50,交了5次后两个测试点全是段错误,原来是数组下标越界了

题目思路:

此题宜用集合处理,根据题目要求,找出集合中的两个集合都有的不相等整数的个数

我们记为共有的,并命名为same,

两个集合一共有的不相等整数的个数,也就是两个集合除了共有的以外的集合元素个数,我们记为不共有的,记为sum;

那这样问题就好办了,根据题目输入元素输出即可了;

但此处还是有几个点需要注意:

这个题用一维集合是解不了的,用二维集合更容易处理多个集合之间的运算,所以说定义set<int>a[100]了(千万别在a[50]了,要不然后两个测试点总是会出现段错误的情况)

另外,这个题多用STL库函数解更方便,因为涉及集合的运算,所以说用集合的STL的库函数运算起来更为简洁;

除此之外,对于打印单个“%"已经不是第一次见了,这个问题在拿来显得有点多余,但是还是说一下吧;

总之,这个题就是根据题目的要求模拟就可以了,令我没想到的是L2中也有模拟题。

Talk is cheap. Show me the code.

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int k;
 5 set<int>a[100];//多维集合 
 6 int sum,same;//表示共有的和非公有的 
 7 double ans;//结果 
 8 int main()
 9 {
10     cin>>n;
11     for(register int i=1;i<=n;i++)
12     {
13         int m;
14         cin>>m;
15         for(register int j=0;j<m;j++)
16         {
17             int temp;
18             cin>>temp;//集合的储存 
19             a[i].insert(temp);
20         }
21     }
22     cin>>k;
23     for(register int i=0;i<k;i++)
24     {
25         sum=same=0;
26         int s1,s2;
27         cin>>s1>>s2;
28         set<int>::iterator it;//list,set,map等数据结构STL要用迭代器来更迭,相当于指针 
29         for(it=a[s1].begin();it!=a[s1].end();it++)
30         {
31             if(a[s2].find(*it)!=a[s2].end())//如果找到末尾有相同的,相同的个数就加一,这个和string的find和npos差不多 
32             same++;
33         }
34          sum=a[s1].size()+a[s2].size()-same;//非共有的是所有的减去共有的 
35          ans=(double)same/sum*100;
36          printf("%.2f%%\n",ans);
37     }
38     return 0;
39 }

再次提醒,千万看清题目要求,别再出现段错误了

posted @ 2022-04-20 19:14  江上舟摇  阅读(79)  评论(0)    收藏  举报