如何找到至少吃 P 个苹果所用的最短时间?请帮我优化这个问题的代码
How to find the minimum time taken to eat at least P apple ? Please Help me to optimize the code for this problem
您好,请帮我解决这个问题。我还在下面附上了一个潜在的解决方案。我需要帮助来优化 java 中的代码。下面给出问题。
问题:
Varun's team participated in an eating competition at FoodContest in
which they are asked to eat at least P apples. Varun's team consists
of N members where a member i (1 <= i <= N ) takes Arr[i] minutes to
eat a single apple. the task is to find the minimum time to eat
at least P apples.
Note: A member can eat a apple any number of times.
例子
Sample Input:-
n=4, p=10 ,
Arr[i] = {1 ,2 ,3 ,4}
Sample output: 6
Explanation:-
1st member will eat 6 apple , (ie, 1*6)
2nd member will eat 3 apple , (2*3)
3rd member will eat 2 apple , (3*2)
4th member will eat 1 apple , (4*1)
total = 12 ( total > p ) ie, team need atlest 6 min (minimum) to eat atleast 10 apples.
Sample Input:-
n=7 ,p=7 ,
Arr[i] = { 1 ,1 ,1 ,1, 1, 1 ,1 }
Sample Output: 1
约束条件:-
1 <= N <= 10^5
1 <= Arr[i] <= 10
1 <= P <= 10^12
代码:(注意:我需要帮助来优化此代码并降低时间复杂度)
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 分钟的时间内,每一分钟要吃多少个苹果:
Time
0
1
2
3
4
5
6
7
8
9
10
11
12
Member 1
0
1
2
3
4
5
6
7
8
9
10
11
12
Member 2
0
0
1
1
2
2
3
3
4
4
5
5
6
Member 3
0
0
0
1
1
1
2
2
2
3
3
3
4
Member 4
0
0
0
0
1
1
1
1
2
2
2
2
3
Total
0
1
3
5
8
9
12
13
16
18
20
21
25
用最后一行的值创建一个数组,即计算这个数组:
int[] total = { 0, 1, 3, 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 分钟。
现在祝你写这个算法的代码好运。
您好,请帮我解决这个问题。我还在下面附上了一个潜在的解决方案。我需要帮助来优化 java 中的代码。下面给出问题。
问题:
Varun's team participated in an eating competition at FoodContest in which they are asked to eat at least P apples. Varun's team consists of N members where a member i (1 <= i <= N ) takes Arr[i] minutes to eat a single apple. the task is to find the minimum time to eat at least P apples.
Note: A member can eat a apple any number of times.
例子
Sample Input:- n=4, p=10 , Arr[i] = {1 ,2 ,3 ,4}
Sample output: 6
Explanation:-
1st member will eat 6 apple , (ie, 1*6)
2nd member will eat 3 apple , (2*3)
3rd member will eat 2 apple , (3*2)
4th member will eat 1 apple , (4*1)
total = 12 ( total > p ) ie, team need atlest 6 min (minimum) to eat atleast 10 apples.
Sample Input:- n=7 ,p=7 , Arr[i] = { 1 ,1 ,1 ,1, 1, 1 ,1 }
Sample Output: 1
约束条件:-
1 <= N <= 10^5
1 <= Arr[i] <= 10
1 <= P <= 10^12
代码:(注意:我需要帮助来优化此代码并降低时间复杂度)
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 分钟的时间内,每一分钟要吃多少个苹果:
Time | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Member 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
Member 2 | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 | 6 |
Member 3 | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 | 3 | 4 |
Member 4 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 3 |
Total | 0 | 1 | 3 | 5 | 8 | 9 | 12 | 13 | 16 | 18 | 20 | 21 | 25 |
用最后一行的值创建一个数组,即计算这个数组:
int[] total = { 0, 1, 3, 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 分钟。
现在祝你写这个算法的代码好运。