题解 | 购物单

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=&judgeStatus=&tags=593&title=&gioEnter=menu

此题解使用了BufferedReader + StreamTokenizer + PrintWriter提高了IO速度,通过封装函数将核心算法抽象出来。

import java.io.*;

public class Main {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out))) {
            StreamTokenizer in = new StreamTokenizer(br);
            while (in.nextToken() != StreamTokenizer.TT_EOF) {
                int m = (int) in.nval;
                in.nextToken();
                int n = (int) in.nval;
                Good[] allGoods = new Good[n];
                int primaryCount = 0;
                for (int i = 0; i < n; i++) {
                    allGoods[i] = readGood(in);
                    if (allGoods[i].q == 0) {
                        primaryCount++;
                    }
                }
                Good[] primaryGoods = new Good[primaryCount];
                int primaryIndex = 0;
                for (Good good : allGoods) {
                    if (good.q == 0) {
                        primaryGoods[primaryIndex++] = good;
                    } else {
                        allGoods[good.q - 1].appendix(good);
                    }
                }
                out.println(solution(primaryGoods, m));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static Good readGood(StreamTokenizer in) throws IOException {
        in.nextToken();
        int v = (int) in.nval;
        in.nextToken();
        int w = (int) in.nval;
        in.nextToken();
        int q = (int) in.nval;
        return new Good(v, w, q);
    }

    public static int solution(Good[] primary, int m) {
        int[][] dp = new int[m + 1][primary.length];
        for (int j = 0; j < primary.length; j++) {
            Good cur = primary[j];
            for (int i = 1; i <= m; i++) {
                int best = j > 0 ? dp[i][j - 1] : 0;
                int[] values = cur.getAllValue();
                int[] joys = cur.getAllJoy();
                for (int k = 0; k < cur.size; k++) {
                    if (i - values[k] >= 0) {
                        best = Math.max(best, joys[k] + (j > 0 ? dp[i - values[k]][j - 1] : 0));
                    }
                }
                dp[i][j] = best;
            }
        }
        return primary.length > 0 ? dp[m][primary.length - 1] : 0;
    }

    private static class Good {
        public int v;
        public int w;
        public int q;
        public int size = 1;
        public Good a1 = null;
        public Good a2 = null;

        public Good(int v, int w, int q) {
            this.v = v;
            this.w = w;
            this.q = q;
        }

        public void appendix(Good a) {
            if (a1 == null) {
                a1 = a;
                size++;
            } else {
                a2 = a;
                size += 2;
            }
        }

        public int[] getAllValue() {
            int[] result = new int[size];
            result[0] = v;
            if (a1 != null) {
                result[1] = v + a1.v;
            }
            if (a2 != null) {
                result[2] = v + a2.v;
                result[3] = v + a1.v + a2.v;
            }
            return result;
        }

        public int[] getAllJoy() {
            int[] result = new int[size];
            result[0] = v * w;
            if (a1 != null) {
                result[1] = v * w + a1.v * a1.w;
            }
            if (a2 != null) {
                result[2] = v * w + a2.v * a2.w;
                result[3] = v * w + a1.v * a1.w + a2.v * a2.w;
            }
            return result;
        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务