C Messenger in MAC
题目大意:
思路解析:
答案计算为 , 可以发现当所选的几个信息固定后,其实后面的一项就变为b_max - b_min,得到了这个结论之后,其实我们可以直接把整个信息按照b进行排序,枚举l,r,那么我最多能选的信息的限制就变为了 a的和 <= L - (br -bl),
因为我们需要选择最多的信息,所以我们在l-r中选择尽量a较小的信息。但是我们可以把选择较小,转为当我们在还能选择时就把当前的选择,当超过时,就不选择当前已经选择中最大的信息。
这部分代码:(这里set可以使用任意排序的数据结构) 每次选择的东西大于限制时,就弹出已经选择了的最大信息
代码实现:
import java.io.*;
import java.util.*;
import static java.lang.String.*;
public class Main {
static int MAXN = 100005;
static int n;
static int mod = 1000000;
static long INF = (long) 1e18;
public static void main(String[] args) throws IOException {
FastScanner f = new FastScanner();
PrintWriter w = new PrintWriter(System.out);
int t = f.nextInt();
for (int o = 0; o < t; o++) {
int n = f.nextInt();
int l = f.nextInt();
int[][] a = new int[n][2];
for (int i = 0; i < n; i++) {
a[i][0] = f.nextInt();
a[i][1] = f.nextInt();
}
Arrays.sort(a, ((o1, o2) -> {
return o1[1] - o2[1];
}));
int max = 0;
for (int i = 0; i < n; i++) {
PriorityQueue<Integer> set = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
long cur = 0;
for (int j = i; j < n; j++) {
if (a[j][1] - a[i][1] > l) break;
cur += a[j][0];
set.add(a[j][0]);
while(a[j][1] - a[i][1] + cur > l){
int num = set.poll();
cur -= num;
}
max = Math.max(max, set.size());
}
}
w.println(max);
}
w.flush();
w.close();
}
private static class FastScanner {
final private int BUFFER_SIZE = 1 << 16;
private DataInputStream din;
private byte[] buffer;
private int bufferPointer, bytesRead;
private FastScanner() throws IOException {
din = new DataInputStream(System.in);
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
private short nextShort() throws IOException {
short ret = 0;
byte c = read();
while (c <= ' ') c = read();
boolean neg = (c == '-');
if (neg) c = read();
do ret = (short) (ret * 10 + c - '0');
while ((c = read()) >= '0' && c <= '9');
if (neg) return (short) -ret;
return ret;
}
private int nextInt() throws IOException {
int ret = 0;
byte c = read();
while (c <= ' ') c = read();
boolean neg = (c == '-');
if (neg) c = read();
do ret = ret * 10 + c - '0';
while ((c = read()) >= '0' && c <= '9');
if (neg) return -ret;
return ret;
}
public long nextLong() throws IOException {
long ret = 0;
byte c = read();
while (c <= ' ') c = read();
boolean neg = (c == '-');
if (neg) c = read();
do ret = ret * 10 + c - '0';
while ((c = read()) >= '0' && c <= '9');
if (neg) return -ret;
return ret;
}
private char nextChar() throws IOException {
byte c = read();
while (c <= ' ') c = read();
return (char) c;
}
private String nextString() throws IOException {
StringBuilder ret = new StringBuilder();
byte c = read();
while (c <= ' ') c = read();
do {
ret.append((char) c);
} while ((c = read()) > ' ');
return ret.toString();
}
private void fillBuffer() throws IOException {
bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
if (bytesRead == -1) buffer[0] = -1;
}
private byte read() throws IOException {
if (bufferPointer == bytesRead) fillBuffer();
return buffer[bufferPointer++];
}
}
}