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 }
再次提醒,千万看清题目要求,别再出现段错误了
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16171315.html
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号