解题思路:
注意事项:
这里我写的尺取法可能有点不一样,但是整体思想是差不多的,这里写的就是每次当前ID在这个时间段有没有出现K次,多了也不用管,直接输出,题目说得从小到大,我试了一下好像不用,不过影响也不大,判断完了直接换下一个不一样,所以需要一个flag来标记,再一个可能i-1不能理解,你可以把他想象成为一个从头开始的for吧。详细的看下面代码理解
参考代码:
package 搜索; import java.util.Arrays; import java.util.Scanner; public class T2279日志统计 { public static void main(String args[]) { int n, d, k; // 输入的N行每行一条日志,包含两个整数ts 和id。 Scanner sc = new Scanner(System.in); n = sc.nextInt(); d = sc.nextInt(); k = sc.nextInt(); ClickHot arr[] = new ClickHot[n]; for (int i = 0; i < n; i++) { int time = sc.nextInt(); int id = sc.nextInt(); arr[i] = new ClickHot(time, id); // 存放每组数字 } Arrays.sort(arr); // 对其进行排序 int parentId = arr[0].id; // 先拿到第一个id boolean flag =false; // 设置一个标志 for (int i = 0; i < n; i++) { // 我当前得id如果有k个赞得话,就是热帖 // 当前位置和以后的k个位置上都是此id,就有k个赞 // 并且时间差小于d,并且没有被输出过 if (i + k - 1 < n && arr[i + k - 1].id == parentId && arr[i + k - 1].ts - arr[i].ts < d && !flag ) { System.out.println(parentId); // 输出这个id 因为题目中只要求输出在同一个时间段有两个赞即可 flag = true;// 这步设置变量,当后面来相同的,但是我不需要输出了,因为两个已经够了 } else if (arr[i].id != parentId) // 这步是如果我不相同id值,那么我就把这个当前的id用我现在i数组中对应的id取代 { parentId = arr[i].id; // 把先前的id替换 flag = false; // 重新设置标志 i = i - 1; // 因为我把上面一个设置了,此时我需要向上减一,然后再做比较, //这样相当于我开始时候i不做变换没我把该取代的值取代掉 } } } } class ClickHot implements Comparable<ClickHot> // 创建一个ClickHot类留存放两个每次的两个数字 一个是 // ts 是td { int ts, id; ClickHot(int ts, int id) // 两个变量 { this.ts = ts; this.id = id; } @Override public int compareTo(ClickHot o) { if (id == o.id) // 先对id做比较其次id相同对ts做比较 return ts - o.ts; else return id - o.id; } }
0.0分
2 人评分
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:702 |
【蟠桃记】 (C++代码)(递归计算)浏览:1060 |
点我有惊喜!你懂得!浏览:1462 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:553 |
大神老白 (C语言代码)浏览:690 |
Wu-求圆的面积 (C++代码)浏览:1994 |
三角形 (C++代码)递推浏览:825 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:574 |
Tom数 (C语言代码)浏览:758 |
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:636 |