Hello,everyone!
我是CS科研GO,一個熱衷於科研和軟開的胖子!
今天爲大家分享的是2019美團和百度JAVA開發崗的秋招編程題。
- (美團)你打開了美了麼外賣,選擇了一家店,你手裏有一張滿X元減10元的券,店裏總共有種菜,第種菜一份需要元,因爲你不想喫太多份同一種菜,所以每種菜你最多隻能點一份,現在問你最少需要選擇多少元的商品才能使用這張券。
輸入數據:第一行兩個正整數和,分別表示菜品數量和券的最低使用價格。(1≤≤100, 1≤≤10000) 接下來一行個整數,第個整數表示第種菜品的價格。(1≤≤100)
輸出數據:一個數,表示最少需要選擇多少元的菜才能使用這張滿元減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英里距離需要一加侖的汽油。他要到達與他家之間距離爲D的辦公室。在去辦公室的途中有N個加油站。由於政府的限制條件,每個加油站只允許向顧客提供一定量的汽油。請注意,爲了保持汽車的運行,油箱內要始終有一些汽油。
編寫一個算法,幫助亨利先生求出他要成功到達辦公室所需停靠加油站的最低次數。如果他不能到達辦公室,輸出爲-1。
輸入
函數方法的輸入包含五個參數:
numOfGS,表示加油站個數的整數(N)
distOfGS,表示加油站與享利家距離的整數列表
allowedGasoline,表示每個加油站可供汽油量的整數列表
distance,表示享利家和辦公室之間距離(D)的整數
initialGasoline,表示亨利汽車中所存汽油初始量(K)的整數
輸出
返回表示亨利爲了成功到達辦公室所需停靠加油站最少次數的整數。
約束
1 ≤ numOfGS ≤
1 ≤distOfGS[i]<distance≤
1≤allowedGasoline[i] ≤
0≤initial Gasoline ≤
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));
}
}
- (百度)Ethan 帶領着由N名成員組成的團隊。Ethan 根據他在每位成員成所完成的任中發現的Bug向各成員分配錯誤分數。由於此錯誤分數已經增加至很大的值,他希望給所有成員一個機會,讓它歸零,並由此提高他們在組織中的名譽。爲了實現這個目標,他制定了一新規則,即如果某位成員成功地完成了一個項目,則成員的錯誤分數就減少P,與此同時,所有其他成員,如果錯誤分數大於零的話會減少Q。
編寫一個算法,幫助Ethan 計算出使所有團隊成員錯誤分數歸零所需要完成的最小項目數。
函數方法的輸入包含四個參數
num,表示團隊成員人數(N)的整數。
projCmptDec,表示成功完成項目的團隊成員的錯誤得分減少的值P的整數。
restDec,表示錯誤分數大於零的團隊成員的錯誤分數減少的值Q的整數。
errorScore,表示團隊成初始錯誤分數的整數列表。
輸出
返回一個整數,表示使所有成員錯誤得分歸零所需要完成的最小項目數。
限制條件
1 ≤ num ≤
1 ≤ restDec ≤ projCmptDec ≤
0 ≤ errorScore[i] ≤
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));
}
}
內容靠得住,關注不迷路。