您想从著名的在线视频游戏商店 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;
}
只要你还有钱,你就增加
ct
,但如果你剩下的钱不足以支付游戏费用,那么你就无法购买。
@辩证法是对的。您缺少问题的关键信息。虽然我已经解决了同样的Hackerrank问题并通过了所有测试用例。我只会分享伪代码,因为我的解决方案是 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)
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);
网络上总有模仿一些热门电影角色的趋势。许多有影响力的人都穿着电影服装来追随这一趋势。如果您正在寻找同样的衣服来成为这一趋势的一部分,请从在线商店购买好莱坞明星皮夹克,以折扣价购买电影皮夹克。