题目描述:
小镇沿街分布(可以理解为都在数轴上,有n家银行(位置以数轴的坐标表示,金额表示可以被抢走的金题),两个绑匪试图分别抢动一个银行为了让警方多奔波他们高定选择的两个银行距离不小于d,请问符合约定的情况下他们能抢到的总金额最大是多少?
输入描述:
输入包括n+1行。
第一行包含两个数字n和d (1≤n≤2000000 ,1<d<10000000) n表示银行的数量,d表示约定的距离
下面n行,每一行包括两个数字a,b(1 < a,b < 0000000)分别表示坐标和金额,空格分隔。
输出描述
输出一个数字,表示可以获得的最大金额。
分析:
这种题做法类似滑动窗口,题目中输入不保证按银行坐标准许输入,所以我们需要先排序。
import java.util.*;
/**
* @author: Mr.Hu
* @create: 2019-03-13 21:10
*/
public class Main{
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while (sc.hasNextInt()){
int n=sc.nextInt(),d=sc.nextInt();
Banck[] bancks=new Banck[n];
int preMax=0,backMax=0;
for (int i = 0; i < n; i++) { // 计算前面最大值 存储数组
Banck banckTemp=new Banck(sc.nextInt(),sc.nextInt());
if (banckTemp.money>preMax) preMax=banckTemp.money; //更新最大值
banckTemp.preMax=preMax;
bancks[i]=banckTemp;
}
Arrays.sort(bancks);
int result=0;
for (int i = 0,j=0; i < n; i++) {
int lMax=0;
while ( (bancks[i].n-bancks[j].n)>d ) j++; //重点:每次只需走一小节就好
lMax=bancks[j].preMax;
int resultTemp= lMax+bancks[i].money;
if (resultTemp>result) result=resultTemp;
}
System.out.println(result);
}
}
}
class Banck implements Comparable<Banck>{
int n;
int money;
int preMax;
@Override
public int compareTo(Banck o) {
return this.n>o.n?1:-1;
}
public Banck(int n, int money) {
this.n = n;
this.money = money;
}
}