万圣节大甩卖| Hackerrank

万圣节大甩卖| Hackerrank,c,algorithm,dynamic-programming,counting,C,Algorithm,Dynamic Programming,Counting,您希望从著名的在线视频游戏商店Mist购买视频游戏 通常,所有游戏都以相同的价格出售,美元。然而,他们正计划在下个月举行万圣节季节性大减价活动,届时你可以以更便宜的价格购买游戏。具体来说,您在销售过程中购买的第一款游戏将以美元出售,但随后购买的每款游戏的价格都将比您之前购买的游戏的价格低。这将一直持续到成本小于或等于美元,之后您购买的每一款游戏都将花费美元 例如,如果和,则以下是您购买的第一款游戏的成本,顺序如下: 你的钱包里有美元。在万圣节大减价期间你能买多少个游戏 我的代码是这样的,我想知道

您希望从著名的在线视频游戏商店Mist购买视频游戏

通常,所有游戏都以相同的价格出售,美元。然而,他们正计划在下个月举行万圣节季节性大减价活动,届时你可以以更便宜的价格购买游戏。具体来说,您在销售过程中购买的第一款游戏将以美元出售,但随后购买的每款游戏的价格都将比您之前购买的游戏的价格低。这将一直持续到成本小于或等于美元,之后您购买的每一款游戏都将花费美元

例如,如果和,则以下是您购买的第一款游戏的成本,顺序如下:

你的钱包里有美元。在万圣节大减价期间你能买多少个游戏

我的代码是这样的,我想知道为什么11/52测试用例失败

#include<stdio.h>
int main()
{
    int ct=0,i,p,d,m,s;
    scanf("%d %d %d %d",&p,&d,&m,&s);
    i=p;
    while(i<s)
    {
        if(p-d>m) p-=d;
        else p=m;
        i+=p;
        ct+=1;
    }
    printf("%d",ct);
    
    return 0;
}
#包括
int main()
{
int ct=0,i,p,d,m,s;
scanf(“%d%d%d%d”、&p、&d、&m、&s);
i=p;
而(im)p-=d;
否则p=m;
i+=p;
ct+=1;
}
printf(“%d”,ct);
返回0;
}

只要你还有钱,你就可以增加
ct
,但是如果你剩下的钱不能支付游戏的费用,那么你就不能买它。

@Dialogicus是对的。您的问题缺少关键信息。而我已经解决了这个问题,并且通过了所有的测试用例。我将只共享伪代码,因为我的解决方案是在JS不C++中。
counter = 0; // sales counter

// we still have enough money for a normal and a discounted game
while s >= m && s >= p

    // Apply discount after one game
    if counter > 0
        p = the larger price between the discounted price & min price       

    // deduct price from wallet
    s -= p;

    // record the sale
    counter++

return counter
我决定包含实际的JS代码,也许你可以传输它

let counter = 0;
while(s >= m && s >= p) {
    p = counter > 0 ? Math.max(p - d, m) : p;
    s -= p;
    counter++;
}
return counter;

为什么不改用公式呢?比如:

if(p>s)
返回0;
int t=min(
ceil((p-m)/(浮动)d),
地板(8*ceil(s-p)/(浮动)d)+1)-1)/2)
);
返回t+楼层((s-(p*t-d*t*(t-1)/2))/m);

问题定义中缺少一些文本。必须提高你的复制粘贴技能。