2018年蓝桥杯省赛(javaB组)第8题
小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有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
import java.util.*;
public class 日志统计 {
public static class node{
int time;
int id;
public node(int time, int id) {
this.time = time;
this.id = id;
}
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int N=s.nextInt();//node个数
int D=s.nextInt();//时间限制
int K=s.nextInt();//数量限定
node[] arr=new node[N];
for (int i=0;i<N;i++){
int time=s.nextInt();//时间点
int id=s.nextInt();//id名
node tempnode=new node(time,id);
arr[i]=tempnode;
}
SortedSet<Integer> res=new TreeSet<>();//用于放置符合条件的id,不会有重复的id名
Arrays.sort(arr, new Comparator<node>() {//使用匿名内部类对arr中的时间进行排序
@Override
public int compare(node t1, node t2) {
return t1.time-t2.time;//这里return r1.ts-r2.ts,如果左值大于右值,则大值往后靠,如果右值大于左值,则小值往前走,总的来说就从小到大排。
}
});
for (int i=0;i<N;i++){
int timelimit=arr[i].time+D;//此处使用尺取法进行
int[] judge=new int[100001];//确保足够大的数组进行尺取法
for (int j=i;j<N&&arr[j].time<timelimit;j++){
judge[arr[j].id]++;
if (judge[arr[j].id]>=K){
res.add(arr[j].id);
}
}
}
for (Integer i : res){
System.out.println(i);
}
}
}
第一次写文章,如果有什么不对的地方,还请拨冗指正,十分感谢!