Hello,everyone!
我是鲁班·,一个热衷于科研和软开的胖子!
今天为大家分享的是2019美团和百度JAVA开发岗的秋招编程题。
- (美团)你打开了美了么外卖,选择了一家店,你手里有一张满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英里距离需要一加仑的汽油。他要到达与他家之间距离为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));
}
}
- (百度)Ethan 带领着由N名成员组成的团队。Ethan 根据他在每位成员成所完成的任中发现的Bug向各成员分配错误分数。由于此错误分数已经增加至很大的值,他希望给所有成员一个机会,让它归零,并由此提高他们在组织中的名誉。为了实现这个目标,他制定了一新规则,即如果某位成员成功地完成了一个项目,则成员的错误分数就减少P,与此同时,所有其他成员,如果错误分数大于零的话会减少Q。
编写一个算法,帮助Ethan 计算出使所有团队成员错误分数归零所需要完成的最小项目数。
函数方法的输入包含四个参数
num,表示团队成员人数(N)的整数。
projCmptDec,表示成功完成项目的团队成员的错误得分减少的值P的整数。
restDec,表示错误分数大于零的团队成员的错误分数减少的值Q的整数。
errorScore,表示团队成初始错误分数的整数列表。
输出
返回一个整数,表示使所有成员错误得分归零所需要完成的最小项目数。
限制条件
1 ≤ num ≤ 2 ∗ 1 0 5 2*10^5 2∗105
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));
}
}
内容靠得住,关注不迷路。