资源限制
内存限制: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)