巧克力盛宴计划

时间:2015-11-26 10:49:47

标签: c algorithm

我正在尝试解决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

2 个答案:

答案 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