原题链接: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();
}
}