結果
問題 |
No.50 おもちゃ箱
|
ユーザー |
![]() |
提出日時 | 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; } } }