2019京东/快手/美团/百度Java开发岗秋招编程题(二)

Hello,everyone!
我是鲁班·,一个热衷于科研和软开的胖子!
今天为大家分享的是2019美团和百度JAVA开发岗的秋招编程题。

  1. (美团)你打开了美了么外卖,选择了一家店,你手里有一张满X元减10元的券,店里总共有 n n n种菜,第 i i i种菜一份需要 A i A_i Ai元,因为你不想吃太多份同一种菜,所以每种菜你最多只能点一份,现在问你最少需要选择多少元的商品才能使用这张券。
    输入数据:第一行两个正整数 n n n X X X,分别表示菜品数量和券的最低使用价格。(1≤ n n n≤100, 1≤ X X X≤10000) 接下来一行 n n n个整数,第 i i i个整数表示第 i i i种菜品的价格。(1≤ A i A_i Ai≤100)
    输出数据:一个数,表示最少需要选择多少元的菜才能使用这张满 X X X元减10元的券,保证有解。
    输入样本:
    5 20
    18 19 17 6 7
    输出样本:
    23
// 这道题乍一看上去,好像贪心算法很适合,实则不然。这里推荐动态规划的思想。
import java.util.*;

public class Main {

    public static int Discount(int[] food_price, int food_count, int base_price){
        // 构造钱仓并初始化
        int[][] expenses = new int[food_count+1][base_price+1];
        for(int i= 0; i<=base_price ;i++) {
            expenses[0][i] = 10001;
        }

        for(int i=1; i<= food_count; i++){
            for(int j=1 ;j <=base_price; j++){
                if(food_price[i-1] >= j){
                    expenses[i][j] = Math.min(food_price[i-1], expenses[i-1][j]);
                }else{
                    expenses[i][j] = Math.min(expenses[i-1][j], food_price[i-1] + expenses[i-1][j-food_price[i-1]]);
                }
            }

        }
        return expenses[food_count][base_price];
    }


    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] m = new int[n];
        int base_price = sc.nextInt();
        for(int i = 0; i < n; i++){
            m[i] = sc.nextInt();
        }
        int result = Discount(m,n,base_price);
        System.out.println(result);
    }
}

  1. (百度)亨利先生有一辆很陈旧的车,它的可行驶里程数很低,因为这是很老的车型,随着时间的推移,效率已经下降很多。行驶1英里距离需要一加仑的汽油。他要到达与他家之间距离为D的办公室。在去办公室的途中有N个加油站。由于政府的限制条件,每个加油站只允许向顾客提供一定量的汽油。请注意,为了保持汽车的运行,油箱内要始终有一些汽油。
    编写一个算法,帮助亨利先生求出他要成功到达办公室所需停靠加油站的最低次数。如果他不能到达办公室,输出为-1。
    输入
    函数方法的输入包含五个参数:
    numOfGS,表示加油站个数的整数(N)
    distOfGS,表示加油站与享利家距离的整数列表
    allowedGasoline,表示每个加油站可供汽油量的整数列表
    distance,表示享利家和办公室之间距离(D)的整数
    initialGasoline,表示亨利汽车中所存汽油初始量(K)的整数
    输出
    返回表示亨利为了成功到达办公室所需停靠加油站最少次数的整数。
    约束
    1 ≤ numOfGS ≤ 1 0 5 10^5 105
    1 ≤distOfGS[i]<distance≤ 1 0 5 10^5 105
    1≤allowedGasoline[i] ≤ 1 0 3 10^3 103
    0≤initial Gasoline ≤ 1 0 5 10^5 105
    0≤i<numOfGS
    示例
    输入
    numOfGS = 4
    distOfGS = [5,7,8,10]
    allowedGasoline = [2,3,1,5]
    distance = 15
    initialGasoline = 5
    输出
    3
    说明:行驶过5英里距离后,他的汽车需要更多汽油,因此他将停靠第一个加油站。从中获得2加仑汽油,再往前2英里他又需要更多的汽油,所以他会进入第二个加油站。之后,他可以驶过第三个加油站,因为第四站可提供能满足他需求的汽油量。
// 用递归的思路解题,方法转自https://blog.csdn.net/justlikeu777/article/details/88983570
public class Main {

    public static int GotoWork(int numOfGS, int[] distOfGS,
                               int[] allowedGasoline, int distance,
                               int initialGasoline) {

        //汽车跑不到加油站的情况,途中没有加油站的情况
        if (distOfGS == null) {
            if (initialGasoline < distance) {
                return -1;
            } else {
                return 0;
            }
        }
        //途中有加油站的情况
        if (initialGasoline >= distance) {//汽车直接跑到终点不用加油
            return 0;
        }
        if (initialGasoline < distOfGS[0]) {//汽车跑不到加油站
            return -1;
        }

        //当汽车跑到第一个加油站位置时
        int cur_numOfGS = numOfGS - 1;
        //当前位置剩余加油站到当前加油站的距离
        int[] cur_distOfGS = null;
        if (distOfGS.length > 1) {
            cur_distOfGS = new int[distOfGS.length - 1];
            for (int i = 1; i < distOfGS.length; i++) {
                cur_distOfGS[i - 1] = distOfGS[i] - distOfGS[0];
            }
        }
        //当前剩余每个加油站可供汽油量的列表
        int[] cur_allowedGasoline = null;
        if (allowedGasoline.length > 1) {
            cur_allowedGasoline = new int[allowedGasoline.length - 1];
            for (int i = 1; i < allowedGasoline.length; i++) {
                cur_allowedGasoline[i - 1] = allowedGasoline[i];
            }
        }

        //当前距离办公室的距离
        int cur_distance = distance - distOfGS[0];
        //当前汽车中存汽油的初始值
        int cur_initialGasoline = initialGasoline - distOfGS[0];

        //从当前加油站出发到终点需要停留的次数
        //当前加油站停留加油
      
        int add_gas = GotoWork(cur_numOfGS, cur_distOfGS, cur_allowedGasoline, cur_distance,cur_initialGasoline + allowedGasoline[0]) + 1;

        //当前加油站不停留
        int no_gas = GotoWork(cur_numOfGS, cur_distOfGS, cur_allowedGasoline, cur_distance, cur_initialGasoline);

       

        if (add_gas != 0 && no_gas != -1) {
            return add_gas< no_gas ? add_gas : no_gas;
        } else if (add_gas == 0 && no_gas != -1) {
            return no_gas;
        } else if (add_gas != 0 && no_gas == -1) {
            return add_gas;
        } else {
            return -1;
        }
    }

    public static void main(String[] args) {
        int numOfGS = 4;
        int[] distOfGS = {5, 7, 8, 10};
        int[] allowedGasoline = {2, 3, 1, 5};
        int distance = 15;
        int initialGasoline = 5;
        System.out.println(GotoWork(numOfGS, distOfGS, allowedGasoline, distance, initialGasoline));
    }
}

  1. (百度)Ethan 带领着由N名成员组成的团队。Ethan 根据他在每位成员成所完成的任中发现的Bug向各成员分配错误分数。由于此错误分数已经增加至很大的值,他希望给所有成员一个机会,让它归零,并由此提高他们在组织中的名誉。为了实现这个目标,他制定了一新规则,即如果某位成员成功地完成了一个项目,则成员的错误分数就减少P,与此同时,所有其他成员,如果错误分数大于零的话会减少Q。
    编写一个算法,帮助Ethan 计算出使所有团队成员错误分数归零所需要完成的最小项目数。
    函数方法的输入包含四个参数
    num,表示团队成员人数(N)的整数。
    projCmptDec,表示成功完成项目的团队成员的错误得分减少的值P的整数。
    restDec,表示错误分数大于零的团队成员的错误分数减少的值Q的整数。
    errorScore,表示团队成初始错误分数的整数列表。
    输出
    返回一个整数,表示使所有成员错误得分归零所需要完成的最小项目数。
    限制条件
    1 ≤ num ≤ 2 ∗ 1 0 5 2*10^5 2105
    1 ≤ restDec ≤ projCmptDec ≤ 1 0 9 10^9 109
    0 ≤ errorScore[i] ≤ 1 0 9 10^9 109
    0 ≤ i < num
    注意:任何团队成员的错误分数不能小于零。
    输入样本
    num = 3
    projCmptDec =4
    restDec =1
    errorScore =[6,4,1]
    输出样本
    3
public class Main {

    public static int num_project=0;

    public static int Update_Score(int num, int projCmptDec, int restDec, int[] errorScore) {

        Arrays.sort(errorScore);
        if (errorScore[num-1]==0){
            return num_project;
        }else{
            errorScore[num-1]=errorScore[num-1]-projCmptDec;
            for(int i=0; i<num-1;i++){
                errorScore[i]=errorScore[i]-restDec;
                if (errorScore[i] <=0){
                    errorScore[i] = 0;
                }
            }
            num_project = num_project +1 ;
            return Update_Score(num, projCmptDec, restDec, errorScore);
        }
        
    }

    public static void main(String[] args) {
        int num = 3;
        int projCmptDec=4;
        int restDec = 1;
        int[] errorScore = {6, 4, 1};
        System.out.println(Update_Score(num, projCmptDec, restDec, errorScore));
    }
}

内容靠得住,关注不迷路。
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CS科研GO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值