Will I leave?.|

Canyooo

园龄:3年5个月粉丝:1关注:1

#1238. 日志统计(acwing)

小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 NN 行。

其中每一行的格式是:

ts id  

表示在 ts 时刻编号 id 的帖子收到一个”赞”。

现在小明想统计有哪些帖子曾经是”热帖”。

如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。

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

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

输入格式

第一行包含三个整数 N,D,K

以下 N 行每行一条日志,包含两个整数 ts 和 id

输出格式

按从小到大的顺序输出热帖 id。

每个 id 占一行。

数据范围

1KN105
0ts,id105
1D10000

输入样例:

7 10 2

0 1

0 10

10 10

10 1

9 1

100 3

100 3

输出样例:1 3

解题思路:

滑动窗口。

通过自检一个Log类继承Comparable接口,将所有记录用时间从小到大排序。

初始化两个数组,list存储当前的点赞数,ans存储满足点赞要求的id号。

滑动窗口的意义就是滑动时后面不符合要求的数要删除,因此添加判断if(log[i].time-log[j].time >= D)时最后面list[log[j].id]--;

复制代码
import java.util.*;

class Log implements Comparable<Log>{
    public int time;
    public int id;
    public Log(int time,int id){
        this.time = time;
        this.id = id;
    }
    public int compareTo(Log o){
        return this.time - o.time;
    }
    
}

class Main{
    public static void main(String str[]){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int D = sc.nextInt();
        int K = sc.nextInt();
        Log[] log = new Log[100010];
        int list[] = new int[100010];
        boolean ans[] = new boolean[100010];
        for(int i = 0;i < N;i++){
            log[i] = new Log(sc.nextInt(),sc.nextInt());
        }
        Arrays.sort(log,0,N);
        for(int i = 0,j = 0;i < N;i++){
            list[log[i].id]++;
            while(log[i].time - log[j].time >= D){    //用while不用if是保证当前i与j之间时间差为D内
                list[log[j].id]--;
                j++;
            }
            if(list[log[i].id]>=K)ans[log[i].id]=true;
        }
        for(int i = 0;i < 100010;i++){
            if(ans[i])System.out.println(i);
        }
    }
}
复制代码

知识点:

自定义类排序条件先继承Comparable接口,并重载compareTo函数;

若是不用类则新建一个Comparator类:(这里是新建对象Comparator!!函数也不一样是compare!!!

Arrays.sort(arr, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } });

本文作者:Canyooo

本文链接:https://www.cnblogs.com/canyooo/p/15929845.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Canyooo  阅读(42)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 黑洞里 方大同
黑洞里 - 方大同
00:00 / 00:00
An audio error has occurred.

Not available