京东笔试

京东笔试 就A了一道

第二道就是简单的模拟啊 不知道为什么一个测试用例都不能通过

我的思路是

首先看两个物种是否相同 相同回合直接结束

两个都没有暴露 回合结束

不同的话 第一种情况是人的暴露了 直接开始战斗

第二种情况 人没有暴露 兽暴露了 决策后战斗 兽就死

靠 正准备写第三种情况 有一方已经死了也直接回合结束 才想起来代码里面没写

接着是第三题 背包问题 带有条件的背包问题 自己写的用例都过了 测试用例只有百分之五

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int N = in.nextInt();
        int T = in.nextInt();
        int[] t1 = new int[N];
        int[] t2 = new int[N];
        int[] s1 = new int[N];
        int[] s2 = new int[N];
        for(int i = 0; i < N; i ++){
            t1[i] = in.nextInt();
            s1[i] = in.nextInt();
            t2[i] = in.nextInt();
            s2[i] = in.nextInt();
        }
        int[] ans = solute(N, T, t1, t2, s1, s2);
        for(int i = 0; i < N; i ++){
            if(ans[i] == -1){
                System.out.print("F");
            }else if(ans[i] == 1){
                System.out.print("B");
            }else{
                System.out.print("A");
            }
        }
    }

    public static int[] solute(int N, int T, int[] t1, int[] t2, int[] s1, int[] s2){
        int[] ans = new int[N];
        int[][][] res = new int[T + 1][N][N];
        // 还是背包问题
        int[][] dp = new int[T + 1][N];
        // dp[i][j] i时间内代表前几门课中可以拿到的最高分
        for(int i = 1; i <= T; i ++){
            for(int j = 0; j < N; j ++){
                //两种情况装第一个或者装第二个 或者都不装
                int price1 = 0;
                int price2 = 0;
                int price3 = 0;
                if(j == 0){
                    if(i - t1[j] >= 0){
                        price1 = s1[j];
                    }
                    if(i - t2[j] >= 0){
                        price2 = s2[j];
                    }
                }else{
                    if(i - t1[j] >= 0){
                        price1 = dp[i - t1[j]][j - 1] + s1[j];
                    }
                    if(i - t2[j] >= 0){
                        price2 = dp[i - t2[j]][j - 1] + s2[j];
                    }
                    price3 = dp[i][j - 1];
                }
                int max = Math.max(price1, price2);
                max = Math.max(max, price3);
                if(max == price3){
                    if(j > 0){
                        res[i][j] = res[i][j - 1];
                    }
                    res[i][j][j] = -1;
                }else if(max == price2){
                    ans[j] = 1;
                    if(j > 0){
                        res[i][j] = res[i - t2[j]][j - 1];
                    }
                    res[i][j][j] = 1;
                }else{
                    ans[j] = 2;
                    if(j > 0)
                        res[i][j] = res[i - t1[j]][j - 1];
                    res[i][j][j] = 2;
                }
                dp[i][j] = max;
            }
        }
        return res[T][N - 1];
    }
}
#京东笔试#
全部评论
100 80 30完全无法理解用例到底是什么,真垃圾
2
送花
回复 分享
发布于 2023-08-26 21:23 湖北
佬,看看realme手机秋招,全球Top5厂商,hc多多,岗位多多
1
送花
回复 分享
发布于 2023-08-26 23:05 广东
现代汽车中国前瞻数字研发中心
校招火热招聘中
官网直投
我只过了百分15,不就是背包问题吗,不知道错再哪里
点赞
送花
回复 分享
发布于 2023-08-26 21:13 山东
我也只过 5%
点赞
送花
回复 分享
发布于 2023-08-26 21:14 广东
不给错误的测试用例,很难判断哪里错了
点赞
送花
回复 分享
发布于 2023-08-26 21:16 广东
俺也一样 100% 0% 5%
点赞
送花
回复 分享
发布于 2023-08-26 21:17 安徽
package main import "fmt" const ( Human = "human" Monster = "monster" ) type Person struct { camp string attack int isAlive bool } func main() { num, round := 0, 0 fmt.Scan(&num, &round) allPerson := make([]*Person, num) camp, attack := "", 0 for i := 0; i < num; i++ { fmt.Scanf("%s %d\n", &camp, &attack) allPerson[i] = &Person{ camp: camp, attack: attack, isAlive: true, } } idx1, idx2, action1, action2 := 0, 0, "", "" for i := 0; i < round; i++ { fmt.Scanf("%d %d %s %s\n", &idx1, &idx2, &action1, &action2) a, b := allPerson[idx1-1], allPerson[idx2-1] if a.camp == b.camp || !a.isAlive || !b.isAlive || action1 == "N" && action2 == "N" { continue } if a.camp == Human && a.attack <= b.attack && action1 == "N" || a.camp == Monster && action2 == "N" { continue } a.isAlive = a.attack > b.attack b.isAlive = b.attack > a.attack } for i := 0; i < num; i++ { res := "Y" if !allPerson[i].isAlive { res = "N" } fmt.Printf("%s", res) } }
点赞
送花
回复 分享
发布于 2023-08-26 21:17 广东
第一题不是没有固定答案的吗
点赞
送花
回复 分享
发布于 2023-08-26 21:18 广东
来个大佬给我指出最后一题错误 我自己把背包问题可能出现的错误都模拟了一下 并没发现什么错误
点赞
送花
回复 分享
发布于 2023-08-26 21:23 湖北
第二题,仔细读题就会发现m没给数据范围,所以m会很大很大
点赞
送花
回复 分享
发布于 2023-08-26 21:24 广西
佬第一题是什么思路
点赞
送花
回复 分享
发布于 2023-08-26 21:24 天津
人和兽就过了10% 一直想不明白
点赞
送花
回复 分享
发布于 2023-08-26 21:27 浙江
100 70 5
点赞
送花
回复 分享
发布于 2023-08-26 21:36 上海
第二题我ac了,没过的话还是有些地方条件判断有遗漏。 这样做可能会好一些: 1. if 种族相同 continue 2. 有一方die or两方全是隐藏身份,continue 3. 如果人类暴露身份,则发动战斗,依次判断战斗力等于,大于,小于 4. 如果兽族身份暴露,则按照人类逻辑来判断战斗力情况
点赞
送花
回复 分享
发布于 2023-08-26 21:37 浙江
同物种的跳过,一方死了跳过,都隐藏跳过,剩下的battle,直接5%😂
点赞
送花
回复 分享
发布于 2023-08-26 21:38 广东
第三题一开始理解错题意了,以为是每道题必须选一种方法来做,然后就觉得不能用动规,只能回溯,最后回溯过了5%
点赞
送花
回复 分享
发布于 2023-08-26 22:40 江苏
我第三题最开始也5%,交卷之后重新做的,需要在dp数组上保存一下得分以及对应的每题做题情况才行,只根据打印出来的dp数组得不到每题的做题情况。
点赞
送花
回复 分享
发布于 2023-08-26 22:53 天津
第二题测试样例有问题,得判断有无下一行输入再处理
点赞
送花
回复 分享
发布于 2023-08-26 23:30 广东
约面了吗
点赞
送花
回复 分享
发布于 2023-09-02 17:41 湖北
京东给你约面了吗
点赞
送花
回复 分享
发布于 2023-09-02 17:43 湖北

相关推荐

4 4 评论
分享
牛客网
牛客企业服务