最大库存(贪婪方法)

时间:2017-08-21 15:45:38

标签: java

在股票市场中,有一种产品具有无限的股票。股票价格给出n天,其中arr [i]表示第i天股票的价格。有一条规则,客户可以在第i天购买最多的库存。如果客户最初的金额为k美元,那么找出他们可以购买的最大库存数量?例如,3天的股票价格为7美元,10美元,4美元。您可以在第1天购买1股价值7美元的股票,在第2天购买价值10美元的2股票,在第3天购买价值4美元的3股票。如果k = 100 $,您可以购买所有股票(共6个)为39 $

约束

1.1< = N&LT = 10 ^ 5
  2.1&LT = ARR [1] - = 100
  3.1< = K&LT = 10 ^ 12
输出格式

打印客户可以购买的最大库存数量。

示例输入0

3
10 7 19
45个

示例输出0
    4
解释0

客户可以在第2天购买1股,第1天购买1股,第10天购买1股,分别为10美元,7x2 = 14美元和19美元。因此,总金额为10 + 14 + 19 = 43,购买的股票数量为4。

我的解决方案仅适用于测试用例0(示例中给出的内容正在工作),java中的7和9
不工作测试案例
INPUT: - 100个
26 94 80 59 32 3 38 91 93 33 78 4 79 98 58 60 20 57 34 33 62 79 3 69 63 22 12 14 35 6 61 74 39 75 31 72 28 70 28 94 78 62 57 29 17 92 1 12 64 27 31 17 97 74 29 27 57 74 97 38 9 80 31 83 62 53 84 91 92 39 20 45 64 27 39 56 76 20 46 63 85 3 66 54 57 91 12 68 98 72 78 48 95 17 33 87 11 68 82 53
167121个
预期输出: -
3868

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

static long buyMaximumProducts(int n, long k, long[] a) {
    // Complete this function
      long numofstocks=0;
      long s=0;
      long quotient=0;
for (int i=0;i<n;i++)
{
    if (k>=a[i])  //still can buy at least one
    {   
        if ((k%a[i])>=(i+1))
        {
            numofstocks= numofstocks+i+1;
            quotient=i+1;
        }
        else
        {   
           if(k/a[i]==0)
           {
               numofstocks++;
               quotient=1;
           }
            else if(k%a[i]!=0)
            {
                numofstocks=numofstocks+(k/a[i]);
                quotient=k/a[i];
            }
            else
            {
                numofstocks=numofstocks+i+1;
                quotient=i+1;
            }
         }

    }

    k=k-(a[i]*quotient);
  }
    return numofstocks;
 }


public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    long[] arr = new long[n];
    for(int arr_i = 0; arr_i < n; arr_i++){
        arr[arr_i] = in.nextLong();
    }
    long k = in.nextLong();
    long result = buyMaximumProducts(n, k, arr);
    System.out.println(result);
    in.close();
}

}

2 个答案:

答案 0 :(得分:1)

谴责你知道“未来”的价格,你需要对股票进行分类并购买最便宜的第一个

修改
您知道所有股票的价格和数量,您不必按顺序购买它们。就像在商店里走20美元一样,目标是尽可能多地购买啤酒。有7个ea的1个,8个ea的2个,3个ea的3个和1个ea的4个(让我们说所有的啤酒都是相同的)。在任何情况下,选择更昂贵的瓶子而不是更便宜的瓶子都是明智之举,所以你开始从最便宜的购买。

让我们将其应用于我们的问题。给定输入

4
7 8 3 1
20

我们有一系列股票

{7, 8, 8, 3, 3, 3, 1, 1, 1, 1}

你的解决方案会以1美元购买1美元,1美元购买8美元,它会停在那里,因为它无法承受第二个8美元的股票。
但是,如果我们对该数组进行排序会发生什么? 结果将是

{1, 1, 1, 1, 3, 3, 3, 7, 8, 8}

现在我们可以贪婪地购买它们! 8股票总计20美元而不是2美元兑换15美元。算法很简单:如果你买得起下一个股票 - 你买它并增加一个柜台。如果没有 - 你打印计数器。

代码资料

import java.util.Arrays; //contains sort function

public class StockBuyer {

    public static void main(String[] args) {

        // here you should parse the input, i'll leave it to you and
        // use values from above example
        int arr[] = {7, 8, 8, 3, 3, 3, 1, 1, 1, 1};
        int moneytospend = 20;
        int bought = 0;

        // sorting array
        Arrays.sort(arr);

        for (int i = 0; i < arr.length && moneytospend >= arr[i]; i++) {
            moneytospend -= arr[i];
            bought++;
        }
        System.out.println(bought);
    }
}

<强> 摘要

D M已经向您展示了您的编码错误,我希望我能够向您解释为什么您的算法错误 仅供参考:在排序之前,有更智能(并且结果更快!)的方法来准备数据。例如。你可以对一组对{数量,数量}进行排序 - 我会留在这里让你弄清楚剩下的;)快乐的编码!

答案 1 :(得分:0)

buyMaximumProducts中的逻辑很远。即使是没有得到最佳解决方案的尝试也是错误的。

您的if语句似乎遇到的问题最多。例如:

if ((k%a[i])>=(i+1))

在这里使用模数运算符是没有意义的。这会给你毫无意义的结果;在某些情况下,结果是,当你甚至没有足够的资金时,它会购买股票。我们将%更改为/

if(k/a[i]==0)

这永远不会成真。我们已经知道k >= a[i],因为我们在那个if语句中,所以这不可能是0.如果它不知何故0,那就意味着你没有足够的钱购买分享。

else if(k%a[i]!=0)

你再次使用模数运算符,这仍然没有意义。使用师。

或者更好的是,甚至不使用分裂。整个条件是不必要的。我们已经知道(在修复了第一段代码之后)k/a[i]小于i+1,这意味着我们可以购买尽可能多的股票,直到我们用尽钱。因此,我们可以在numofstocks = numofstocks + (k / a[i]); quotient=k/a[i];块中使用else

因此if逻辑简化为:

    if (k >= a[i])  //still can buy at least one
    {   
        if ((k / a[i]) >= (i+1))
        {
            numofstocks = numofstocks + i + 1;
            quotient=i+1;
        }
        else
        {
            numofstocks = numofstocks + (k / a[i]);
            quotient=k/a[i];
        }
    }

但等等,还有另一个错误。如果条件if (k>=a[i])为假,则表示您没有足够的资金购买股票。但是k=k-(a[i]*quotient);行仍然被执行,使得算法认为即使没有购买也会花钱。因此,您可以将k=k-(a[i]*quotient);置于if语句中,也可以包含else语句,将quotient设置为0,而不是将其保留为之前的任何值。

当然,一旦你完成了所有这些,它不正确。它将尽可能快地花掉所有的钱,这不是最佳的。它需要先做最便宜的日子。