试题 历届真题 日志统计【第九届】【省赛】【B组】python

资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:ts id
表示在ts时刻编号id的帖子收到一个"赞"。

现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。

具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。

给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

输入格式

第一行包含三个整数N、D和K。
以下N行每行一条日志,包含两个整数ts和id。

对于50%的数据,1 <= K <= N <= 1000
对于100%的数据,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000

输出格式

按从小到大的顺序输出热帖id。每个id一行。

输入样例

7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出样例

1
3

个人思路

id作为key,ts以列表的格式作为value。对于一个id,判断总点赞是否少于k,少于则不满足;如果不少于,将ts从小到大排序,从1-k开始检查时间差是否,满足记录id,并退出进入下一个id,不满足将窗口右移动,所有都不满足就结束。所有id重复该操作直至结束。

n, d, k = map(int, input().split())
arr = dict()
# id作为key,点赞时刻用列表保存为value
for i in range(n):
    ts, id = input().split()
    if id in arr.keys():
        arr[id].append(int(ts))
    else:
        arr[id] = [int(ts)]
        
id = [] # 保存热帖id

for key  in arr.keys():
    arr[key] = sorted(arr[key]) # 把时刻从小到大排序
    if len(arr[key]) >= k: # 如果总点赞少于k,肯定不是热帖
        # 从第k个开始检查,k时刻-k-k+1时刻是否小于规定的时间
        for i in range(k-1,len(arr[key])):
            # 一但找到说明该贴曾经是热帖,保存id,进入下一个
            if arr[key][i] - arr[key][i-k+1] < d:
                id.append(int(key))
                break 
id = sorted(id)
for i in id:
    print(i)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值