2019拼多多暑期实习生机试题-03 避嫌抢劫(java)

本文讨论了一道编程题目,涉及两个绑匪在小镇上的银行抢劫问题。题目要求绑匪选择的两家银行之间的距离至少为d,以避免警方快速追捕。通过对银行坐标进行排序,利用滑动窗口算法,可以找到在满足距离限制下能抢到的最多金额。
摘要由CSDN通过智能技术生成

题目描述:

       小镇沿街分布(可以理解为都在数轴上,有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;
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值