【问题标题】:Why i am getting Terminated due to timeout in this code on Hackerrank? My last iteration is not taking place?为什么我会因为 Hackerrank 上的这段代码超时而被终止?我的最后一次迭代没有发生?
【发布时间】:2019-05-14 17:00:24
【问题描述】:

问题-小鲍比喜欢巧克力。他经常去他最喜欢的商店 Penny Auntie 购买它们。他们正在 Penny Auntie 升职。如果 Bobby 节省了足够的包装纸,他可以将它们上交以获得免费巧克力。

例如,鲍比必须在每块巧克力上花钱。他可以上交包装纸来接收另一个酒吧。最初,他买了条,吃完后有包装纸。他上交了他们,给他留下了更多的酒吧。吃完这两个后,他有了茄衣,然后把茄衣和他的新酒吧留给他。一旦他吃了那个,他就会有包装纸并将它们交给另一个酒吧。吃完那个,他只有茄衣,宴席结束。总的来说,他吃过酒吧。

功能说明

在下面的编辑器中完成 ChocolateFeast 功能。它必须返回 Bobby 在充分利用促销活动后可以吃的巧克力数量。

chocolateFeast 有以下参数:

n:一个整数,代表 Bobby 的初始金额 c:表示巧克力条成本的整数 m:一个整数,表示他可以为一个免费酒吧提供的包装数量 注意:如果小鲍比有足够的钱获得免费巧克力,他总是会上交包装纸。

输入格式

第一行包含一个整数,表示要分析的测试用例的数量。 接下来的每一行都包含三个以空格分隔的整数: 、 和 。它们代表要花的钱、巧克力的成本,以及他可以为免费巧克力上交的包装纸数量。

约束

输出格式

对于每次去 Penny Auntie 的旅行,将 Bobby 吃的巧克力总数打印在一个新行上。

示例输入

3 10 2 5 12 4 4 6 2 2 样本输出

6 3 5

我已经用下面的代码试过了-

static int chocolateFeast(int n, int c, int m) {
    int bars=n/c;
    int wrapper=bars;
    int sum=bars;
    while((wrapper/m)!=0){
        bars=wrapper/m;
        sum+=bars;
        wrapper=bars+bars%m;
    }
return sum;
}
public static void main(String[] args)throws IOException{
    Scanner sc=new Scanner(System.in);
    int t,n,c,m,total;
    t=sc.nextInt();
    for (int i=1;i<=t;i++){
        n=sc.nextInt();
        c=sc.nextInt();
        m=sc.nextInt();
        total=chocolateFeast(n,c,m);
        System.out.println(total);
    }
}

}

输入(标准输入) 3 10 2 5 12 4 4 6 2 2 你的输出(标准输出) 6 3 预期产出 6 3 5

【问题讨论】:

  • 很确定你的循环永远不会在第三种情况下结束
  • 不,实际上它只提供 2 个输出。最后一个循环没有执行。
  • 你在第三种情况下陷入while循环就是他的意思,这是真的
  • 所以我应该改变while循环中的条件?
  • 你应该写下你正在做的逻辑并手工完成最后一个案例,并确保它有意义,你的问题不是“代码”本身,而是你使用的逻辑。最后的 while 循环永远不会低于或等于 0。

标签: java algorithm timeout


【解决方案1】:

EDIT2:

我读错了问题,并根据 M Oehm 更改了代码。下面的代码现在似乎可以工作了。您正在检查 bars%m 而不是 wrapper%m

    static int chocolateFeast(int n, int c, int m) {
        int bars=n/c;
        int wrapper=bars;
        int sum=bars;
        while((wrapper/m) != 0){
            bars=wrapper/m;
            wrapper=bars + wrapper%m;
            sum+=bars;
        }
    return sum;
    }

我检查了您提供的示例的输出,它正确输出了6 3 5

【讨论】:

  • 问题中哪里说您只能在 m 次中交易包装器?当我读到它时,m 就是你需要多少包装纸才能得到另一个巧克力棒。在我看来,错误在于 OP 计算了您可以获得多少条柱,但没有删除包装器:wrapper = wrapper % m + bars,其中wrapper % m 是交易其余部分后的包装器。
  • @M Oehm 是的,看起来你是对的,我读到“m:一个整数,表示他可以为一个免费酒吧上交的包装数量”作为次数,然后这输出了预期的输出所以我不认为我读错了。
  • 感谢您的帮助 Nevexis ..我试图弄清楚我的逻辑,这就是我所做的-while(m
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多