微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何找到吃至少 P 苹果的最短时间?请帮我优化这个问题的代码

如何解决如何找到吃至少 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 举报,一经查实,本站将立刻删除。