【问题标题】:Halloween Sale | Hackerrank万圣节特卖 |黑客等级
【发布时间】:2021-02-24 10:56:31
【问题描述】:

您想从著名的在线视频游戏商店 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;
}

【问题讨论】:

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

标签: c algorithm dynamic-programming counting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    @Dialectus 是对的。您缺少问题的关键信息。虽然我已经解决了同样的Hackerrank problem 并通过了所有测试用例。我只会分享伪代码,因为我的解决方案是 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;
    

    【讨论】:

      【解决方案3】:

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

      if (p > s)
        return 0;
      
      int t = min(
        ceil((p - m) / (float)d),
        floor((sqrt(8 * ceil((s - p) / (float)d) + 1) - 1) / 2)
      );
      
      return t + floor((s - (p * t - d * t * (t - 1) / 2)) / m);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 2022-07-29
        • 1970-01-01
        • 2015-09-27
        • 2023-03-10
        相关资源
        最近更新 更多