結果
問題 | No.393 2本の竹 |
ユーザー | Kilisame |
提出日時 | 2016-09-14 11:07:35 |
言語 | Java21 (openjdk 21) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,022 bytes |
コンパイル時間 | 3,616 ms |
コンパイル使用メモリ | 84,604 KB |
実行使用メモリ | 177,628 KB |
最終ジャッジ日時 | 2024-11-17 05:55:26 |
合計ジャッジ時間 | 20,893 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 232 ms
56,868 KB |
testcase_01 | AC | 149 ms
168,820 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 159 ms
41,796 KB |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | TLE | - |
testcase_10 | WA | - |
testcase_11 | TLE | - |
testcase_12 | TLE | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | AC | 136 ms
41,504 KB |
testcase_16 | WA | - |
testcase_17 | AC | 218 ms
50,180 KB |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | AC | 145 ms
41,264 KB |
testcase_21 | WA | - |
testcase_22 | TLE | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | AC | 161 ms
42,200 KB |
testcase_26 | AC | 135 ms
41,472 KB |
testcase_27 | TLE | - |
ソースコード
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; public class TwoBamboo { /* メモ化用Map */ private static Map<Integer, Integer> calculatedMap; /* 2本の竹のうち短い方の竹を対象にしてナップサック問題として考える。 */ public static void main(String[] args) { Scanner cin = new Scanner(System.in); int d = cin.nextInt(); int[][][] allQuestions = new int[d][2][]; for (int i = 0; i < d; i++) { /* 2本の竹情報 */ allQuestions[i][0] = new int[2]; allQuestions[i][0][0] = cin.nextInt(); allQuestions[i][0][1] = cin.nextInt(); /* 要求数 */ int requestsNum = cin.nextInt(); /* 要求情報 */ allQuestions[i][1] = new int[requestsNum]; for (int j = 0; j < requestsNum; j++) { allQuestions[i][1][j] = cin.nextInt(); } } calculatedMap = new HashMap<Integer, Integer>(); for (int[][] question : allQuestions) { System.out.println(answer(question[0], question[1])); } } /* 各データセット単位で解く */ private static int answer(int[] bamboo, int[] requests) { /* 2本の竹の総和に対し、要求された長さを小さい順に足していく。要求された長さの和が2本の竹の総和を越えたら、以降の要求には絶対に応えられないので無視する。また、長いほうの竹を越える要求も満たせないので無視する */ Arrays.sort(requests); int lengthSum = bamboo[0] + bamboo[1]; int maxRequestLength; int requestSum = 0; for (maxRequestLength = 0; maxRequestLength < requests.length; maxRequestLength++) { requestSum += requests[maxRequestLength]; if (requests[maxRequestLength] > bamboo[1] || requestSum > lengthSum) { break; } } requests = Arrays.copyOf(requests, maxRequestLength); calculatedMap.clear(); return getNum(0, bamboo[0], bamboo[1], requests, new ArrayList<Integer>()); } private static int getNum(int currentIndex, int shortBamboo, int longBamboo, int[] requests, List<Integer> cutIndexes) { int key = currentIndex * 10000000 + shortBamboo; if (calculatedMap.containsKey(key)) { return calculatedMap.get(key); } /* 最後の要求まで達したか、短い方の竹から切り出せなくなったら、今まで切らなかったものを順に長い方から切っていき、切れなくなったら終了 */ if (currentIndex >= requests.length || requests[currentIndex] > shortBamboo) { int result = 0; for (int i = 0; i < requests.length; i++) { if (!cutIndexes.contains(i)) { longBamboo -= requests[i]; if (longBamboo < 0) { break; } result++; } } calculatedMap.put(key, result); return result; } /* 切った場合 */ List<Integer> cutIndexesNext = new ArrayList<Integer>(cutIndexes); cutIndexesNext.add(currentIndex); int cutNum = 1 + getNum(currentIndex + 1, shortBamboo - requests[currentIndex], longBamboo, requests, cutIndexesNext); int notCut = getNum(currentIndex + 1, shortBamboo, longBamboo, requests, cutIndexes); int result = cutNum > notCut ? cutNum : notCut; calculatedMap.put(key, result); return result; } private static void debug(int[] bamboo, int[] requests) { System.out.println("bamboo: a=" + bamboo[0] + ", b=" + bamboo[1]); for (int request : requests) { System.out.print(request + " "); } System.out.println(); } }