結果

問題 No.393 2本の竹
ユーザー KilisameKilisame
提出日時 2016-09-14 10:53:02
言語 Java21
(openjdk 21)
結果
WA  
実行時間 -
コード長 4,042 bytes
コンパイル時間 3,546 ms
コンパイル使用メモリ 85,608 KB
実行使用メモリ 180,964 KB
最終ジャッジ日時 2024-11-17 05:55:03
合計ジャッジ時間 19,512 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 221 ms
67,580 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
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 140 ms
41,328 KB
testcase_16 WA -
testcase_17 AC 216 ms
49,444 KB
testcase_18 WA -
testcase_19 WA -
testcase_20 AC 143 ms
41,012 KB
testcase_21 AC 191 ms
47,884 KB
testcase_22 TLE -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 TLE -
権限があれば一括ダウンロードができます

ソースコード

diff #

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) {
        /* 最後の要求まで達したなら終了 */
        if (currentIndex >= requests.length) {
            return 0;
        }
        int key = currentIndex * 1000000 + shortBamboo;
        if (calculatedMap.containsKey(key)) {
            return calculatedMap.get(key);
        }
        /* 短い方の竹から切り出せなくなったら、今まで切らなかったものを順に長い方から切っていき、切れなくなったら終了 */
        if (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++;
                }
            }
            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();
    }
}
0