【问题标题】:How to find the minimum time taken to eat at least P apple ? Please Help me to optimize the code for this problem如何找到至少吃 P 个苹果所需的最短时间?请帮我优化这个问题的代码
【发布时间】:2021-03-23 22:43:28
【问题描述】:

您好,请帮助我为这个问题提供优化的解决方案。我还在下面附上了一个潜在的解决方案。我需要帮助来优化 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)

第 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 }

样本输出: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;
                } 
            }  
        }

    }
}

【问题讨论】:

  • 所以...有 >>youWhy is “Can someone help me?” not an actual question?
  • 感谢斯蒂芬的评论。 .感谢您指出有问题的错误。这个问题没有错误,唯一的问题是我的解决方案的时间复杂度会很高。所以我需要你的帮助来优化它。我指出二进制搜索的原因是因为我的一个朋友说我们可以用二进制搜索进行优化,但我没有明白他的意思。如果您对我的代码有任何潜在的优化解决方案,请在下面发表评论。

标签: java data-structures time-complexity binary-search


【解决方案1】:

说输入是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 分钟。

现在祝你为这个算法编写代码好运。

【讨论】:

  • 感谢 Andreas 提供有关如何解决这个问题的见解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多