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