wowpH 2019-04-16 11:13 采纳率: 33.3%
浏览 332

ACM俱乐部的书架问题,代码改错

原题链接:ACM俱乐部的书架
我用Java“写”的,好吧,就是抄的,网上的都是C语言,我改成了Java
这是别人用C++写的正确答案的链接
下面是我改成的Java代码,我实在是看不出来哪儿不同,已经写了三遍了。。。这里贴的是没注释的代码,还没AC我都不好意思拿出我的注释版。。。

公开账号:FreeAccount

密码:FreeAccount

大家可以用这个账号提交你改的代码

/**
 * 用时:Wrong Answer
 * @author wowpH
 * @version A3.0
 * @date 2019年4月16日 上午10:17:41
 */

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    private Scanner sc;

    private class Book implements Comparable<Book> {
        int h;
        int t;

        @Override
        public int compareTo(Book b) {
            if (this.h > b.h) {
                return -1;
            }
            if (this.h < b.h) {
                return 1;
            }
            return 0;
        }
    }

    private Book[] book;
    private int[][] hi;
    private int N;
    private int width;

    /**
     * 
     */
    public Main() {
        sc = new Scanner(System.in);
        book = new Book[100];
        for (int i = 0; i < 100; i++) {
            book[i] = new Book();
        }
        hi = new int[2500][2500];
        while (sc.hasNext()) {
            N = sc.nextInt();
            width = 0;
            for (int i = 0; i < N; i++) {
                book[i].h = sc.nextInt();
                book[i].t = sc.nextInt();
                width += book[i].t;
            }
            Arrays.sort(book);
            for (int i = 0; i <= width; i++) {
                for (int j = 0; j <= width; j++) {
                    hi[i][j] = Integer.MAX_VALUE;
                }
            }
            hi[0][0] = 0;
            for (int k = 1; k < N; k++) {
                for (int i = width; i >= 0; i--) {
                    for (int j = width; j >= 0; j--) {
                        if (Integer.MAX_VALUE != hi[i][j]) {
                            if (0 == i) {
                                hi[i + book[k].t][j] = Math.min(hi[i + book[k].t][j], hi[i][j] + book[k].h);
                            } else {
                                hi[i + book[k].t][j] = Math.min(hi[i + book[k].t][j], hi[i][j]);
                            }
                            if (0 == j) {
                                hi[i][j + book[k].t] = Math.min(hi[i][j + book[k].t], hi[i][j] + book[k].h);
                            } else {
                                hi[i][j + book[k].t] = Math.min(hi[i][j + book[k].t], hi[i][j]);
                            }
                        }
                    }
                }
            }
            int area = Integer.MAX_VALUE;
            for (int i = 1; i <= width; i++) {
                for (int j = 1; j <= width; j++) {
                    if (Integer.MAX_VALUE != hi[i][j]) {
                        int w = Math.max(i, j);
                        w = Math.max(w, width - i - j);
                        area = Math.min(area, (book[0].h + hi[i][j]) * w);
                    }
                }
            }
            System.out.println(area);
        }
        sc.close();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Main();
    }
}

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-04-16 12:32
    关注

    手上没有环境,把debug的思路说下
    (1)在代码的结尾处下断点,看所有的变量是否和c++程序运行结束的一致,如果一致,找测试用例,直到发现不一致。
    (2)在代码的中间下断点,用之前有不同输出的用例测试,看代码的中间是否一致,如果一致,往下,不一致,往上。
    (3)将存在差异的范围缩小到最小,再仔细看这几行代码。可以尝试换一个写法看看。特别注意那些产生副作用的表达式(通常这些在C语言里属于未定义行为)

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘