第九届蓝桥杯省赛第八题(java)

/*

标题:日志统计

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:

ts id  

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

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

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

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

*/

import java.util.*;

import static java.util.Collections.sort;

public class test08 {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//日志的行数
        int d = scanner.nextInt();//时间间隔
        int k = scanner.nextInt();//热词的最低频率
        int a[] = new int[n];//时间的数组
        int b[] = new int[n];//帖子的编号
        Map<Integer, Integer> map01 = new HashMap<Integer, Integer>();//统计k
        Map<Integer, Integer> map02 = new HashMap<Integer, Integer>();//判断是否是热帖
        List<Integer> e = new ArrayList<Integer>();
        a[0] = scanner.nextInt();
        b[0] = scanner.nextInt();
        map01.put(b[0], 1);
        map02.put(b[0], a[0]);
        for (int i = 1; i < n; i++) {
            a[i] = scanner.nextInt();
            b[i] = scanner.nextInt();
            if (map01.containsKey(b[i])) {
                int time = map02.get(b[i]);
                if (a[i] - time < d) {//如果在热帖规定的范围内
                    int count = map01.get(b[i]);
                    map01.put(b[i], count+1);
                }
            } else {
                map01.put(b[i], 1);
                map02.put(b[i], a[i]);
            }
        }
        System.out.println();
        Set<Integer> set = map01.keySet();
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()) {
            int key = it.next();
            if (map01.get(key) >= k) {
                e.add(key);
            }
        }
        sort(e);
        Iterator w = e.iterator();
        while (w.hasNext()) {
            System.out.println(w.next());
        }

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章