题目原型:
约翰错过了他的公交车,他一路从家走到学校。他的学校和家之间的距离是D个单位。他开始时有K个单位的初始能量。他每走1个单位的距离,能量也减少1个单位。
在他去学校的路上,有N个果汁摊。每个果汁摊都有特定量的果汁(以升为单位)。他每消费一升果汁,能量增加1个单位。请注意,为了能让他持续走路,他的能量不应该为零。
写一个算法,帮助约翰找出为了成功到达学校他应该停下补充能量所需要的最小果汁摊位数目。如果他不能到达学校,输出应为 -1。
输入:
该函数方法的输入包括5个参数——
numOfStalls, 表示果汁摊数目的整数(N);
distOfStalls, 表示约翰的家与摊位距离的整数列表;
juiceQuantity, 表示每个果汁摊位可获得的果汁量的整数列表;
distance, 表示约翰的家和学校之间距离的整数(D);
initialEnergy, 表示约翰的初始能量的整数(K)。
输出:
返回一个整数,表示约翰为了成功到达学校而应该停下的最小果汁摊位的数目。
假定:
约翰消费能力是无限的;
约翰不知道水果摊的数量和每个水果摊能提供的果汁量。(既表示,他如果能量不够的话只能见一个水果摊就喝果汁,因为他并不知道后面还有没有水果摊)
Java代码实现:
static int FinMinNumOfJuiStalls(int numofStalls, int[] distOfStalls, int[] juiceQuantity, int distance, int initialEnergy) {
int count = 0;
if (initialEnergy >= distance)//首先判断初始能量是否能到达学校
return 0;
else {
//当前获得的能量
int hasEnergy = 0;
for (int i = 0; i < numofStalls; i++) {
count++;
int leftDistance = distance - distOfStalls[i];
hasEnergy = hasEnergy + juiceQuantity[i];
int currentEnergy = initialEnergy - distOfStalls[i] + hasEnergy;
if (currentEnergy >= leftDistance)
return count;
}
}
return -1;
}
调用
public static void main(String[] args) {
//水果摊总数
int numofStalls = 4;
//每个水果摊离约翰家的距离列表
int[] distOfStalls = {2, 3, 5, 6};
//每个水果摊可以获得的果汁量的列表
int[] juiceQuantity = {1, 2, 2, 1};
//约翰家和学校之间的距离
int distance = 10;
//约翰初始能量
int initialEnergy = 7;
int count = FinMinNumOfJuiStalls(numofStalls, distOfStalls, juiceQuantity, distance, initialEnergy);
System.out.println("约翰需要的最小水果摊的个数" + count);
}
请大神指点,如有问题,及时沟通。