L2-007 家庭房产 (25 分)python

L2-007 家庭房产 (25 分)python

前言

因为本人属于新手,所以代码比较乱,但主要是用到了几个知识点。

1.并查集

这里我就不仔细讲了,有一个大佬用很有趣的方式讲解了。

并查集

2.sort函数和cmp函数结合

这个就是我们的排序sort函数,如果当我们有两个选项,身高和年龄。

题目要求身高高的排在前面,如果身高一样的就年龄大的排在前面,这个时候我们就可以使用我们的cmp。

3.set直接求交集比较方便

2.分数

在这里插入图片描述

4检查点比较难过,如果不适用数据结构久荣超时,他的条件就是人数和孩子都取最大N和k

3.思路
1.初始化

我们就根据并差级的思想把同一组人的老大设置为父亲也就是妈妈的老大也是父亲,孩子的老大也是父亲,本人的老大也是父亲,孩子的孩子等等如此,首先第一遍先把每组遍历一遍,但是这样肯定会不完全,因为前面组的老大没有更新,或者后来的几组的老大没有关联上,所以我们结束一遍之后要再遍历一遍。

这次遍历的意义就是因为我们知道一组的本人父亲和母亲还有孩子可能不对应一个老大,但是既然出现再一个家族他们就对应一个老大,我们要他们都收到一个家族里面来,让他们每一个人都对应老大,我们就规定每组的本人的老大为全组的老大。

2.收集信息

这个就比较简单了前面我们再初始化的同时也记录了每组的房产数和房产价值,这次我们就进行遍历,因为每组的所有人的老大都是一个,只要收集整个所有组里面不同老大的个数,并用字典记录他们,每找到一个相同的老大组,就把两个组合并到一起用set的求并集这样,不会有重复,直接统计出同一个老大的所有组,化成一个大组,也就对应题目的家族。其他总人数,平均房产,还是平均价值就好算了。

3.比较

我们把我们收集好的几大家族信息放到列表里面,利用sort和cmp自定义函数结合,进行排序就ok了。

4.代码

代码写的比较烂,好多地方没有优化,都是直接想到哪写到哪的,因为天梯赛一般不限制内存要求,所以就舒服着随便开了字典和列表。

from functools import cmp_to_key

dic = {} 
dic2 = {}
dic3 = {}
def xy_cmp(x, y):
    if x[3] > y[3]:
        return 1
    elif x[3] == y[3]:
        if x[0] < y[0]:
            return 1
        else:
            return -1
    else:
        return -1

def change(key):
    if key in dic:
        if key == dic[key]:
            return key
        key = change(dic[key])
        return key
    else:
        return key

num = int(input())
li = []
mon = []
for i in range(num):
    s = input()
    s = s.split()
    a = []
    for j in range(3):
        if s[j] != '-1':
            a.append(s[j])
    p = 4
    for j in range(int(s[3])):
        a.append(s[p])
        p += 1
    mon.append([int(s[-2]), int(s[-1])])
    li.append(a)
    if s[1] == '-1' and s[2] == '-1':
        flag = s[0]
    elif s[1] == '-1' and s[2] != '-1':
        flag = s[2]
    else:
        flag = s[1]
    for val in a:
        dic[val] = change(flag)
for i, val in enumerate(li):
    flag = change(val[0])
    for key in val:
        if dic[key] != flag:
            dic[dic[key]] = change(flag)
        dic[key] = change(flag)
for i, val in enumerate(li):
    flag = dic[val[0]]
    if flag not in dic2:
        dic2[flag] = set(val)
        dic3[flag] = [min(val),mon[i][0],mon[i][1]]
    else:
        dic2[flag] = dic2[flag] | set(val)
        dic3[flag] = [min(dic2[flag]),mon[i][0]+dic3[flag][1],mon[i][1]+dic3[flag][2]]

mon = []
for key in dic2:
    a = len(dic2[key])
    mon.append([dic3[key][0], a, dic3[key][1]/a,dic3[key][2]/a])
mon.sort(key=cmp_to_key(xy_cmp), reverse=True)
print(len(mon))
for i in mon:
    print(i[0], i[1], end=' ')
    print('%.3f' % i[2], end=' ')
    print('%.3f' % i[3])


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值