826 京东笔试2.75/3 (附代码)

第一题:

将读过的数放到hashset中去重,然后暴力遍历即可

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; ++i) {
            a[i] = in.nextInt();
        }
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < n; ++i) {
            if (i != 0) System.out.print(" ");
            int target = i + 1 - a[i] % (i + 1);
            while (set.contains(target)) {
                target += i + 1;
            }
            set.add(target);
            System.out.print(target);
        }
    }

第二题:

暴力:分四种情况讨论

我只过了75%,卡在读取角色不存在,ok,可能是我读数的时候搞错了,那我每次读一行,自己切分算了,结果还是有问题

()public static void main(String[] args) throws FileNotFoundException {
//        Scanner in = new Scanner(new File("t2.txt"));
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        boolean[] identifyHuman = new boolean[n];
        int[] action = new int[n];
        boolean[] exists = new boolean[n];
        for (int i = 0; i < n; ++i) {
            identifyHuman[i] = "human".equals(in.next());
            action[i] = in.nextInt();
            exists[i] = true;
        }
        for (int i = 0; i < m; ++i) {
            int id1 = in.nextInt() - 1;
            int id2 = in.nextInt() - 1;
            boolean show1 = "Y".equals(in.next());
            boolean show2 = "Y".equals(in.next());
            if (!exists[id1] || !exists[id2]) continue;
            if (!identifyHuman[id1] && show2 && identifyHuman[id2]) {
                fight(id1, id2, action, exists);
            } else if (!identifyHuman[id2] && show1 && identifyHuman[id1]) {
                fight(id1, id2, action, exists);
            } else if (identifyHuman[id1] && show2 && !identifyHuman[id2] &&
                    action[id1] > action[id2]) {
                exists[id2] = false;
            } else if (identifyHuman[id2] && show1 && !identifyHuman[id1] &&
                    action[id1] < action[id2]) {
                exists[id1] = false;
            }
        }
        for (int i = 0; i < n; ++i) System.out.print((exists[i] ? 'Y' : 'N'));
    }

    static void fight(int id1, int id2, int[] action, boolean[] exists) {
        if (action[id1] < action[id2]) {
            exists[id1] = false;
        } else if (action[id1] == action[id2]) {
            exists[id1] = exists[id2] = false;
        } else exists[id2] = false;
    }

第三题:

背包问题+结果集回溯一下就ok

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int t = in.nextInt();
        int[][] arr = new int[n][4];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < 4; ++j) {
                arr[i][j] = in.nextInt();
            }
        }
        //背包问题
        int[][] dp = new int[n + 1][t + 1];
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= t; ++j) {
                int goodt = arr[i - 1][0];//完美解决的耗时
                int goodv = arr[i - 1][1];//完美解决的价值
                int badt = arr[i - 1][2];//暴力解决的耗时
                int badv = arr[i - 1][3];//暴力解决的价值
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                if (j >= goodt) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - goodt] + goodv);
                }
                if (j >= badt) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - badt] + badv);
                }
            }
        }
        //回溯结果集
        int cur = t;
        int[] res = new int[n];
        for (int i = n; i >= 1; --i) {
            int goodt = arr[i - 1][0];
            int goodv = arr[i - 1][1];
            int badt = arr[i - 1][2];
            int badv = arr[i - 1][3];
            //判断是不是选择了完美解决
            if (cur >= goodt && dp[i - 1][cur - goodt] + goodv == dp[i][cur]) {
                cur -= goodt;
                res[i - 1] = 1;
            }
            //判断是不是选择了暴力解决
            else if (cur >= badt && dp[i - 1][cur - badt] + badv == dp[i][cur]) {
                cur -= badt;
                res[i - 1] = 2;
            }
            //都不是,说明没有选择
            else {
                res[i - 1] = 0;
            }
        }
        for (int i = 0; i < n; ++i) {
            if (res[i] == 0) System.out.print("F");
            else if (res[i] == 1) System.out.print("A");
            else System.out.print("B");
        }
    }

全部评论
13都是一样的思路,但是一直超时不知道为啥。第二题似乎数据输入有问题,加了个try给过了
点赞 回复 分享
发布于 2023-08-26 21:21 广东
第三题这里有点疑问:dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); 为什么要从dp[i][j - 1]转移 没道理呀
点赞 回复 分享
发布于 2023-08-26 21:53 江西

相关推荐

评论
4
14
分享

创作者周榜

更多
牛客网
牛客企业服务