Bonuses on a Line
题目大概意思,给出x轴上
n
个坐标的点,这些点上有股票。我们从坐标为0
的点开始移动,做多可以移动t
秒,每秒只能在坐标上移动一个长度。问:最多可以收集多少股票?
分别枚举左走的点,然后使用二分获取在这个点的情况下,最多可以右折返能收集多少股票。
先右走同理。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
int[] positive = new int[200001];
int[] negative = new int[200001];
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
sc.nextToken();
int n = (int) sc.nval;
sc.nextToken();
int t = (int) sc.nval;
int posi = 1;
int negi = 200000;
while (n-- > 0) {
sc.nextToken();
int now = (int) sc.nval;
if (now >= 0) {
positive[posi++] = now;
} else {
negative[negi--] = -now;
}
}
long res = 0;
for (int i = 0; i < posi && positive[i] <= t / 2; i++) {
res = Math.max(i + binarySearchLow(negi, 200000, negative, t - 2 * positive[i]) - negi, res);
}
for (int i = negi; i <= 200000 && negative[i] <= t / 2; i++) {
res = Math.max((i - negi) + binarySearchLow(0, posi - 1, positive, t - 2 * negative[i]), res);
}
System.out.println(res);
}
//二分查找数组nums在l到r之间小于等于k的最大索引。
public static int binarySearchLow(int l, int r, int[] nums, int k) {
while (l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] <= k) {
l = mid;
} else {
r = mid - 1;
}
}
return l;
}
}