我正在尝试解决the Chocolate Feast challenge on HackerRank:
小鲍勃喜欢吃巧克力,然后他带着口袋里的N来到商店。每种巧克力的价格是$ C.商店提供折扣:对于他给商店的每一个M包装,他免费获得一个巧克力。鲍勃可以吃多少巧克力?输入格式: 第一行包含测试用例的数量T. 随后是T行,每行包含三个整数,N,C和M.
输出格式: 打印Bob吃的巧克力总数。
约束:
1≤T≤1000
2≤N≤105
1≤C≤N
2≤M≤N
示例输入:
3
10 2 5
12 4 4
6 2 2
示例输出:
6
3
5
解释 在第一种情况下,他可以用10美元购买5个巧克力并交换5个包装以获得一个巧克力。因此,巧克力的总数是6。
在第二种情况下,他可以花12美元购买3个巧克力。然而,需要4个包装才能获得一份巧克力。他无法提供优惠,因此巧克力总数仍为3。
在第三种情况下,他可以以6美元的价格购买3个巧克力。现在他可以更换3个包装中的2个并再加1块巧克力。现在,他可以使用他的1个未使用的包装纸和新巧克力的1个包装纸来获得一块巧克力。所以总数是5。
以下是我在C中的解决方案的尝试:
#include<stdio.h>
int main(){
int t; //total test cases
scanf("%d",&t);
for(int a0 = 0; a0 < t; a0++){
int n; //money
int c; //cost of 1 chocolate
int m; //no of wrappers to buy a new chocolate
scanf("%d %d %d",&n,&c,&m);
int tc=0,nw=0,nc=0,w=0;//tc=totalChocolates nw=newWrappers nc=newChocolates w=wrappers
tc=n/c;
w=tc;
while(w>=m){
nc=(w/m);
tc+=nc;
w-=m;
nw=w%m;
w+=nw;
}
printf("%d\n",tc);
}
return 0;
}
问题是我的程序传递了一些测试用例,而在其他测试用例中失败了,但是我无法找到错误的位置。 此外,对于其他一些测试,所用时间超过2秒。
测试案例
Input
Excepted output
答案 0 :(得分:2)
你的逻辑相当混乱:
while(w>=m){
nc=(w/m);
tc+=nc;
w-=m;
nw=w%m;
w+=nw;
}
如果将其更改为此,则会传递所有测试用例:
while(w>=m){
nc=(w/m); // how many additional bars can we buy ?
tc+=nc; // accumulate total bars purchased
w-=(nc*m); // deduct no of wrappers used to purchase additional bars
w+=nc; // accumulate additional wrappers
}
答案 1 :(得分:0)
此程序(在编辑之前)为此输入输出10
而不是9
。
1
5 1 2
在while
循环中尝试此操作:
m*nc
m
而不是w
nc
代替nw
添加到tc