2026/2/20 19:57:20
网站建设
项目流程
安徽门户网站建设,黄页网大全免费软件,网站架构图图,12380网站建设的意见建议题目描述最近小明又喜欢上了集合#xff0c;于是他提出了很多有关集合的问题#xff0c;其中的一个问题是给你两个集合#xff08;集合内部没有重复的元素#xff09;#xff0c;让你求集合的相似度是多少#xff0c;集合的相似度定义如下#xff1a;2个集合的相似度 相…题目描述最近小明又喜欢上了集合于是他提出了很多有关集合的问题其中的一个问题是给你两个集合集合内部没有重复的元素让你求集合的相似度是多少集合的相似度定义如下2个集合的相似度 相同元素的个数/(相同元素个数不同元素个数)聪明的你可以帮助小明解决这个问题吗输入格式题目含有多组数据第一行一个数T表示数据的组数对于每组数据第一行包括两个数n,m分别表示两个集合元素的个数(1n,m100000)第二行n个数表示前一集合的n个数以空格隔开第三行m个数表示后一集合的m个数以空格隔开其中对于两集合中任意数ai有。输出格式对于每组数据输出两个集合的相似度输出结果乘100 后取整数部分。样例【样例输入】22 31 22 3 43 35 3 43 4 1【样例输出】2550数据范围与提示对于10%的数据1 T 2 n,m 4对于50%的数据1 T 4n,m 1024对于100%的数据1 T10 n,m 100000一些想法这道题用 set 做非常简单因为 set 是可以自动去重的那输入两个数组的数时可以直接放入 set 中它会自动去重也就是将两个数组相同的数直接去掉。然后 sum 等于两个数组的数个数总和减去 set 中数的个数去重去了几个数也就是两个集合中重复元素的数量。然后最终答案等于要 double 类型的因为答案是小数点乘100要先等于小数double 类型的 sum 除以 set 的长度这里可以理解为重复元素数量在并集元素数量中的占比最后输出 int 类型的答案乘 100 换行。最后要清空 set 否则有多组数据时后面的会答案错误。注输出答案转换类型时要 (int)(ss*100)不能(int) ss*100否则会先转换 ss 的类型从而导致精确度丢失。别问我是怎么知道的用一个别的数先储存 set 的长度减少写代码时的麻烦也是可以的AC代码#includebits/stdc.h using namespace std; int t; setint s; int main(){ cint; while(t--){ int n,m,sum0; cinnm; for(int i1;in;i){ int x; cinx; s.insert(x); } for(int i1;im;i){ int x; cinx; s.insert(x); } sumnm-s.size(); double ss(double)sum/s.size(); cout(int)(ss*100)endl; s.clear(); } return 0; }