如何解决如何找到吃至少 P 苹果的最短时间?请帮我优化这个问题的代码
嗨,请帮我优化这个问题的解决方案。我还在下面附上了一个潜在的解决方案。我需要帮助来优化 Java 中的代码。问题如下。
问题:
Varun 的团队参加了 FoodContest 的饮食比赛 他们被要求至少吃 P 个苹果。 Varun 的团队包括 N 个成员中的成员 i (1
示例
样本输入:- n=4,p=10,Arr[i] = {1,2,3,4}
样本输出:6
说明:-
第一个成员会吃 6 个苹果,(即 1*6)
第二个成员吃3个苹果,(2*3)
第三个成员吃2个苹果,(3*2)
第4个成员吃1个苹果,(4*1)
total = 12 ( total > p ) 即,团队需要至少 6 分钟(最少)吃至少 10 个苹果。
样本输入:- n=7,p=7,Arr[i] = { 1,1,1 }
样本输出:1
限制条件:-
1
1
1
import java.io.*;
import java.util.*;
class Main {
public static void main (String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(system.in));
String[] str = br.readLine().split(" ");
String[] input = br.readLine().split(" ");
int n = Integer.parseInt(str[0]);
long p = Long.parseLong(str[1]);
long [] arr = new long [n];
long max = 1000000000000L ;
for(int i=0; i<n; i++)
{
arr[i] = Long.parseLong(input[i]);
}
for(long j=1;j<=max;j++){
long sum=0;
for(int i=0;i<n;i++){
long rem=j/arr[i];
sum=sum+rem;
if(sum>=p){
System.out.println(j);
return;
}
}
}
}
}
解决方法
说输入是arr = {1,2,3,4},p = 60
。
首先计算 least common denominator (LCD),在本例中为 12
。
现在计算,在 12 分钟内的每一分钟,将吃掉多少苹果:
时间 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
成员 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
成员 2 | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 | 6 |
会员 3 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | 3 | 4 |
会员 4 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 3 |
总计 | 0 | 1 | 3 | 5 | 8 | 9 | 12 | 13 | 16 | 18 | 20 | 21 | 25 |
用最后一行的值创建一个数组,即计算这个数组:
int[] total = { 0,1,5,8,9,12,13,16,18,20,21,25 };
您不需要存储每个成员的中间值。为清楚起见,它们仅在上方显示。
我们现在知道团队每 12 分钟吃掉 25 个苹果,所以要吃掉总共 60 个苹果,我们至少需要 2 个完整的回合。所以我们计算:
full rounds = p / 25 = 60 / 25 = 2
apples left = p % 25 = 60 % 25 = 10
time taken = 2 * 12 = 24 minutes
apples eaten = 2 * 25 = 50
现在对剩余苹果的计算数组进行二分搜索,如果没有找到精确匹配,则选择下一个更高的值。对于剩下的 10 个苹果,那就是 time = 6,total = 12
。
这意味着我们还需要 6 分钟才能吃掉另外 12 个苹果,因此在 30 (24 + 6) 分钟内总共吃掉了 62 (50 + 12) 个苹果。
结果: 30 分钟。
现在祝你编写这个算法的代码好运。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。