CSP 201909-4 推荐系统(Python)

题目链接:

计算机软件能力认证考试系统icon-default.png?t=LA92http://118.190.20.162/view.page?gpid=T91

 

 

【思路】因为最后取的时候是按照全部商品的优先级来,所以我把商品类别和商品编号合并成一个键,str(type)+'#'+str(id),值就是商品的得分,这样就可以把他们存在同一个字典中了,这样添加和删除都是O(1)。

查询的时候首先对字典中的元素进行自定义规则的排序,排序的复杂度为O(nlogn)比较高,所以定义一个变量记录上次排序后是否进行了插入或删除操作,只有操作过才重新排序。最后,记录总个数k和每类商品的个数,按照题目给的个数输出。

但是。。超时了,只能拿10分。

from functools import cmp_to_key
def cmp(a, b):
    if a[1] < b[1]:
        return 1
    elif a[1] == b[1]:
        p1, q1 = [int(i) for i in a[0].split('#')]
        p2, q2 = [int(i) for i in b[0].split('#')]
        if p1 > p2:
            return 1
        elif p1 == p2:
            if q1 > q2:
                return 1
    return -1
m, n = [int(i) for i in input().split()]
goods = {}
for _ in range(n):
    a, b = [int(i) for i in input().split()]
    for i in range(m):
        key = str(i) + '#' + str(a)
        goods[key] = b
tmp = sorted(goods.items(), key=cmp_to_key(cmp))
p = int(input())
modify = 0
for _ in range(p):
    op = [int(i) for i in input().split()]
    type = op[0]
    if type == 1:
        modify = 1
        key = str(op[1]) + '#' + str(op[2])
        goods[key] = op[3]
    elif type == 2:
        modify = 1
        key = str(op[1]) + '#' + str(op[2])
        goods.pop(key)
    else:
        if modify == 1:
            modify = 0
            tmp = sorted(goods.items(), key=cmp_to_key(cmp))
        # print(tmp)
        k = op[1]
        cnt = [0] * m
        res = [[] for i in range(m)]
        num = 0
        for i in range(2, len(op)):
            if op[i] > 0:
                num += 1
            cnt[i - 2] = op[i]
        i = 0
        while i < k:
            good = tmp[i]
            a, b = [int(j) for j in good[0].split('#')]
            if cnt[a] > 0:
                res[a].append(b)
                cnt[a] -= 1
                if cnt[a] == 0:
                    num -= 1
            if num == 0:
                break
            i += 1
        for i in res:
            if len(i) == 0:
                print(-1)
            else:
                for j in range(len(i)):
                    if j == len(i) - 1:
                        print(i[j])
                    else:
                        print(i[j], end=' ')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值