結果
| 問題 |
No.50 おもちゃ箱
|
| コンテスト | |
| ユーザー |
jp_ste
|
| 提出日時 | 2016-05-23 05:40:52 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 1,002 ms / 5,000 ms |
| コード長 | 4,663 bytes |
| コンパイル時間 | 4,789 ms |
| コンパイル使用メモリ | 83,560 KB |
| 実行使用メモリ | 119,536 KB |
| 最終ジャッジ日時 | 2024-06-25 21:15:00 |
| 合計ジャッジ時間 | 14,541 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 38 |
ソースコード
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;
public class Main2 {
static int n, m;
static ArrayList<Integer> a, b;
public static void main(String[] args) {
try (Scanner scan = new Scanner(System.in)) {
n = Integer.parseInt(scan.next());
a = new ArrayList<>();
for(int i=0; i<n; i++) {
a.add(Integer.parseInt(scan.next()));
}
m = Integer.parseInt(scan.next());
b = new ArrayList<>();
for(int i=0; i<m; i++) {
b.add(Integer.parseInt(scan.next()));
}
a.sort(Collections.reverseOrder());
b.sort(Collections.reverseOrder());
LinkedList< ArrayList<Integer> > checkList = new LinkedList<>();
LinkedList< ArrayList<Integer> > nextCheckList = new LinkedList<>();
checkList.add(a);
for(int i=0; i<b.size(); i++) {
while(!checkList.isEmpty()) {
final ArrayList<Integer> nowList = checkList.poll();
boolean flag = false;
for(Integer v : nowList) {
if(b.get(i) < v) {
flag = true;
break;
}
}
if(flag) continue;
nodeList.clear();
solve(0, b.get(i), new ArrayList<Integer>(), nowList);
for(int k=0; k<nodeList.size(); k++) {
ArrayList<Integer> pList = nodeList.get(k).list;
ArrayList<Integer> tmpList = (ArrayList<Integer>)nowList.clone();
for(int j=0; j<pList.size(); j++) {
tmpList.remove(pList.get(j));
}
if(tmpList.size() == 0) {
System.out.println(i+1);
System.exit(0);
}
nextCheckList.add(tmpList);
}
}
checkList = (LinkedList< ArrayList<Integer> >)nextCheckList.clone();
nextCheckList.clear();
}
System.out.println(-1);
}
}
static ArrayList<Node> nodeList = new ArrayList<>();
static void solve(int i, int box, ArrayList<Integer> list, ArrayList<Integer> a) {
ArrayList<Integer> tmpList = (ArrayList<Integer>)list.clone();
if(i == a.size()) {
Node node = new Node(box, (ArrayList<Integer>)list.clone());
for(Node now : nodeList) {
if(node.equals(now)) {
return;
}
}
nodeList.add(node);
return;
}
solve(i+1, box, tmpList, a);
if((box - a.get(i)) >= 0) {
tmpList.add(a.get(i));
solve(i+1, box-a.get(i), tmpList, a);
}
}
static class Node implements Comparable<Node> {
int rem;
ArrayList<Integer> list;
Node(int rem, ArrayList<Integer> list) {
this.rem = rem;
this.list = list;
}
@Override
public int compareTo(Node o) {
if(rem == o.rem) {
if(list.size() == o.list.size()) {
for(int i=0; i<list.size(); i++) {
if(list.get(i) == o.list.get(i)) continue;
return o.list.get(i) - list.get(i);
}
return 0;
} else {
return list.size() - o.list.size();
}
} else {
return rem - o.rem;
}
}
@Override
public String toString() {
return rem + " " + list.toString();
}
@Override
public boolean equals(Object obj) {
Node t = (Node)obj;
boolean flag = true;
if(list.size() != t.list.size()) {
flag = false;
} else {
for(int i=0; i<list.size(); i++) {
if(list.get(i) != t.list.get(i)) {
flag = false;
break;
}
}
}
return flag;
}
}
}
jp_ste