2019京東/快手/美團/百度Java開發崗秋招編程題(二)

Hello,everyone!
我是CS科研GO,一個熱衷於科研和軟開的胖子!
今天爲大家分享的是2019美團和百度JAVA開發崗的秋招編程題。

  1. (美團)你打開了美了麼外賣,選擇了一家店,你手裏有一張滿X元減10元的券,店裏總共有nn種菜,第ii種菜一份需要AiA_i元,因爲你不想喫太多份同一種菜,所以每種菜你最多隻能點一份,現在問你最少需要選擇多少元的商品才能使用這張券。
    輸入數據:第一行兩個正整數nnXX,分別表示菜品數量和券的最低使用價格。(1≤nn≤100, 1≤XX≤10000) 接下來一行nn個整數,第ii個整數表示第ii種菜品的價格。(1≤AiA_i≤100)
    輸出數據:一個數,表示最少需要選擇多少元的菜才能使用這張滿XX元減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 ≤ 10510^5
    1 ≤distOfGS[i]<distance≤10510^5
    1≤allowedGasoline[i] ≤10310^3
    0≤initial Gasoline ≤10510^5
    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 ≤ 21052*10^5
    1 ≤ restDec ≤ projCmptDec ≤ 10910^9
    0 ≤ errorScore[i] ≤ 10910^9
    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));
    }
}

內容靠得住,關注不迷路。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章