You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeChef装箱问题代码调试求助:编译通过但测试用例结果异常

代码问题排查:Chef打包书籍的最少箱子数计算

有人能告诉我我的代码哪里出问题了吗?它编译正常,但在CodeChef的测试用例中无法给出正确结果。

题目描述

Chef正在搬新家!不幸的是,这意味着他需要打包物品以便搬运。目前,Chef正在将他的藏书装进纸箱。
Chef有X个书架,每个书架恰好有Y本书。每个纸箱最多可容纳Z本书。为了不打乱书籍的整理,Chef确保不同书架的书不会放在同一个箱子里。
在这些条件下,打包所有书籍所需的最少箱子数是多少?

输入格式

第一行输入一个整数T,表示测试用例的数量。
每个测试用例包含一行输入,包含三个空格分隔的整数X、Y和Z:即题目描述中的数值。

输出格式

对于每个测试用例,在新行输出一个整数:所需的最少箱子数。

样例输入输出

输入                        输出
5 9 9                        5
5 9 7                        10
2 3 2                        4
22 34 12                     66

样例解释

测试用例1:每个箱子可装9本书,每个书架有9本书。因此Chef只需要5个箱子:每个书架一个。
测试用例2:每个箱子可装7本书,每个书架有9本书。因此每个书架需要2个箱子(例如一个装4本,另一个装5本)。共有5个书架,总箱子数为5×2=10。
测试用例3:每个箱子可装2本书,每个书架有3本书。因此每个书架需要2个箱子(例如一个装2本,另一个装1本)。共有2个书架,总箱子数为2×2=4。
测试用例4:每个书架需要3个箱子来装所有书。共有22个书架,因此答案是22×3=66。

我的代码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int T = sc.nextInt();
    while (1 <= T && T-- <= 100) {
        int s = sc.nextInt();
        int b = sc.nextInt();
        int cap = sc.nextInt();
        int r = b / cap;
        int q = r + 1;
        if (b <= cap) {
            System.out.println(+s);
        } else if (b == 0 && s == 0 && cap == 0) {
            System.out.println(0);
        } else {
            System.out.println(q * s)
        }
    }
}

代码问题分析与修正

你的代码存在以下几个核心问题:

  • 循环条件逻辑错误:while (1 <= T && T-- <= 100) 的写法混乱,无法保证遍历所有T个测试用例,会导致部分用例被漏处理。
  • 整除场景计算错误:当单书架书籍数b能被箱子容量cap整除时(比如样例1的9/9=1),你的代码会错误地计算为r+1=2,导致总箱子数翻倍,这是与样例结果不符的关键原因。
  • 冗余特殊条件:b == 0 && s == 0 && cap == 0的判断完全多余,题目输入的书架数、书籍数应为正整数,且该场景也可通过通用逻辑处理。
  • 语法疏漏:System.out.println(q * s)末尾缺少分号,会导致编译失败。

修正后的代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        // 正确遍历所有测试用例
        while (T-- > 0) {
            int shelves = sc.nextInt();
            int booksPerShelf = sc.nextInt();
            int capacity = sc.nextInt();
            
            // 用整数技巧实现向上取整,同时处理整除和非整除场景
            int boxesPerShelf = (booksPerShelf + capacity - 1) / capacity;
            int totalBoxes = shelves * boxesPerShelf;
            
            System.out.println(totalBoxes);
        }
        sc.close();
    }
}

关键改进点

  • 使用(booksPerShelf + capacity - 1) / capacity实现整数向上取整,这是处理“除法向上取整”的通用技巧,能同时正确处理整除(如9/9)和非整除(如9/7)的情况。
  • 修正循环条件为T-- > 0,确保处理所有测试用例。
  • 变量名更具可读性,避免混淆。
  • 新增Scanner资源关闭操作,养成良好编码习惯。

内容的提问来源于stack exchange,提问作者MOHIT DISAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:25:15