美团8.20笔试情况

### 第四题 为什么只a了18(看完评论区,已经懂了没有初始化dp数组!
public class FourthDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();//表示A的长度
        int M = sc.nextInt();//表示B的长度
        int[] A = new int[N];
        int[] B = new int[M];
        for (int i = 0;i < N;i++){
            A[i] = sc.nextInt();
        }
        for (int i = 0;i < M;i++){
            B[i] = sc.nextInt();
        }
        //定义一个dp[i][j]表示A前i个和B的前j个 一样至少需要多少时间
        int[][] dp = new int[N + 1][M + 1];
        for (int i = 1;i <= N;i++){
            for (int j = 1;j <= M;j++){
                if(A[i - 1] == B[j - 1]){
                    //说明这个元素不需要改变就已经相等
                    dp[i][j] = dp[i - 1][j - 1];
                }else {
                    //如果两者长度一致 则肯定是选择操作一 变换一个元素
                    //如果两者长度不一致,则肯定是选择操作二,删除一个元素
                    if(i == j){
                        //长度一致
                        dp[i][j] = dp[i - 1][j - 1] + Math.abs(A[i - 1] - B[j - 1]);
                    }else if(i < j){
                        //B长
                        dp[i][j] = dp[i][j - 1] + Math.abs(B[j - 1]);
                    }else {
                        //A长
                        dp[i][j] = dp[i - 1][j] + Math.abs(A[i - 1]);
                    }
                }
            }
        }
        System.out.println(dp[N][M]);
    }
}
### 第四题已经懂了 来看第三题(思路好像出现了问题,我用的是最优队列)
public class ThirdDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();//一共N道题目
        int M = sc.nextInt();//最多复习M题目,使得M题100%作对!

        int [] P = new int[N];//记录每一题作对的概率
        for (int i = 0;i < N;i++){
            P[i] = sc.nextInt();
        }
        //按照最对概率排序,优先学习得分低的!
        PriorityQueue<int[]> queue = new PriorityQueue<>(((o1, o2) -> {
            int p1 = o1[0];
            int score1 = o1[1];
            int p2 = o2[0];
            int score2 = o2[1];
            if(p1 * score1 != p2 * score2){
                return p1 * score1 - p2 * score2;
            }else {
                //概率一样 按分高排序
                return score2 - score1;
            }
        }));
        int[] scores = new int[N];
        for (int i = 0;i < N;i++){
            scores[i] = sc.nextInt();
            queue.offer(new int[]{P[i],scores[i]});
        }

        double maxScores = 0;
        while (!queue.isEmpty()){
            int[] poll = queue.poll();
            int p = poll[0];
            int score = poll[1];
            if(M-- > 0){
                //100%得分!
                maxScores += score;
            }else {
                //按照概率得分!
                double trueScore = (p * score) / 100d;
                maxScores += trueScore;
            }
        }
        System.out.printf("%.2f",maxScores);
    }
}





#美团笔试##做完美团2023秋招笔试,你还好吗#
全部评论
dp[0][0] = 0; for (int i = 1; i <= n; i++) { dp[i][0] = dp[i-1][0] + Math.abs(A[i-1]); } for (int i = 1; i <= m; i++) { dp[0][i] = dp[0][i-1] + Math.abs(B[i-1]); }
点赞
送花
回复
分享
发布于 2022-08-20 12:50 广东
如果A比B长只有前面的不一样呢
点赞
送花
回复
分享
发布于 2022-08-20 12:46 浙江
秋招专场
校招火热招聘中
官网直投
你没有给dp[0][j]和dp[i][0]初始化
点赞
送花
回复
分享
发布于 2022-08-20 12:48 广东
好像要long
1
送花
回复
分享
发布于 2022-08-20 12:46 江苏
懂了 没有初始化!感谢大佬们的解答!
1
送花
回复
分享
发布于 2022-08-20 12:55 湖北
第三题数组中每一道题目都有期望值,你这个贪心不行,你直接就算出每一道题目的实际分数减去他的期望分数,找出差值最大的m个就好了
1
送花
回复
分享
发布于 2022-08-20 13:22 湖北
你没有给数组进行初始化,其中一个数组长度为零的时候你怎么计算呢
点赞
送花
回复
分享
发布于 2022-08-20 12:50 湖北
第三题的贪心可以先把不复习之前的期望值加起来,然后算每一门分别复习后与之前可以提升分数的差值,然后把最高的n个(可以复习的科目数)加起来就好了
点赞
送花
回复
分享
发布于 2022-08-20 15:51 湖北

相关推荐

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