PAT L2-005. 集合相似度

本文介绍了一个计算两个整数集合相似度的C++程序。通过读取输入的整数集合,程序利用标准模板库(set)来存储集合中的唯一整数,并计算两个集合之间的相似度。相似度定义为两个集合共有不相等整数数量除以两个集合所有不相等整数数量之和再乘以100%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


给定两个整数集合,它们的相似度定义为:Nc/Nt*100%。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数N(<=50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(<=104),是集合中元素的个数;然后跟M个[0, 109]区间内的整数。

之后一行给出一个正整数K(<=2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
输出样例:
50.00%
33.33%


#include<stdio.h>
#include<set>
using namespace std;

set<int>ms[60];

void slove(int x,int y)
{
    int sum=0;
    set<int>res;

    set<int>::iterator it,is;
    for(it=ms[x].begin(); it!=ms[x].end(); it++)
    {
        is=ms[y].find(*it);
        if(is!=ms[y].end())
            sum++;
    }
    double t=sum*1.0/(ms[x].size()+ms[y].size()-sum);
    printf("%.2f%%\n",t*100);
    return ;
}

int main()
{
    int n,k,v,a,b;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        ms[i].clear();
        scanf("%d",&k);
        for(int j=0; j<k; j++)
        {
            scanf("%d",&v);
            ms[i].insert(v);
        }
    }
    scanf("%d",&k);
    for(int i=0; i<k; i++)
    {
        scanf("%d%d",&a,&b);
        a--;
        b--;
        slove(a,b);
    }
    return 0;
}

关于 Python 的 L2-005 问题解析或练习题答案,以下是详细的分析和解决方案: ### 题目背景 L2-005PAT (Programming Ability Test) 中的一道题目,属于 Level 2 级别的编程挑战。该题目通常涉及较为复杂的算法设计和数据结构应用。 #### 题目描述 假设某公司有多个部门,每个员工隶属于某个部门。现在需要统计各部门的平均工资并按降序排列输出。如果两个部门的平均工资相同,则按照部门名称字典顺序升序排列[^1]。 --- ### 解决方案 为了实现上述功能,可以采用以下方法: 1. **输入处理** 输入的第一行为整数 N 表示员工数量;随后 N 行每行包含三个字段:`name`, `department`, 和 `salary`。其中 `name` 是字符串表示员工姓名,`department` 是字符串表示所属部门,`salary` 是浮点数表示薪资。 2. **逻辑设计** 使用字典存储每个部门及其对应的总薪资和人数。遍历所有员工记录更新这些信息。 3. **计算与排序** 计算每个部门的平均薪资,并将其存入一个新的列表中以便后续排序操作。排序规则为先按平均薪资降序排列,再按部门名升序排列。 4. **输出结果** 输出满足条件的结果集。 下面是基于以上思路的具体代码实现: ```python from collections import defaultdict def calculate_average_salary(): n = int(input().strip()) department_info = defaultdict(lambda: {"total_salary": 0, "count": 0}) for _ in range(n): name, department, salary_str = input().strip().split() salary = float(salary_str) department_info[department]["total_salary"] += salary department_info[department]["count"] += 1 result = [] for dept, info in department_info.items(): avg_salary = info["total_salary"] / info["count"] result.append((dept, avg_salary)) sorted_result = sorted(result, key=lambda x: (-x[1], x[0])) for item in sorted_result: print(f"{item[0]} {item[1]:.2f}") calculate_average_salary() ``` --- ### 关键点解释 1. **默认字典的应用** 利用了 `collections.defaultdict` 来简化初始化过程,避免手动判断键是否存在的情况[^2]。 2. **多级排序策略** 排序函数中的 lambda 表达式实现了两级排序标准:首先是负号 `-x[1]` 实现降序排列,其次是 `x[0]` 实现字典序升序排列[^3]。 3. **精度控制** 在打印最终结果时,通过格式化字符串 `{:.2f}` 控制保留两位小数[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值