在股票市场中,有一种产品具有无限的股票。股票价格给出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();
}
}
答案 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,而不是将其保留为之前的任何值。
当然,一旦你完成了所有这些,它仍不正确。它将尽可能快地花掉所有的钱,这不是最佳的。它需要先做最便宜的日子。