米哈游笔试0803

8.3米哈游笔试(已挂)

第一道

package com.面试中的算法.米哈游秋招;

import java.util.Scanner;

/**
 * @author xing'chen
 * @version 1.0
 * @description:
 * 米小游有一个长度为 n 的数组,其中第 i 个元素为 ai。现在定义数组的价值是最大的相邻数字的乘积。例如数组为 [3,5,1,2] ,
 * 相邻元素的乘积分别是 35=15,51=5和1*2=2 ,则数组的价值是这些数字中的最大值,即 15。
 *
 * 现在米小游想要任选数组中的某两个相邻的元素进行交换(你必须使用这次交换机会),他想知道最大可以将数组的价值更改为多少?
 *
 * 输入描述
 *
 * 第一行输入一个整数 n(2<=n<=10^5)  表示数组的长度。 第二行输入 n 个整数 a1,a2,.....,an (1<=ai<=10^5) 表示数组中的值。
 *
 * 输出描述
 *
 * 在一行上输出一个整数表示答案。
 * @date 2024/8/3 20:37
 */
public class MAIN1 {
    public static void main(String[] args) {
        //表示数组长度
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long[] arr=new long[n];
        //表述该数组的各数字
        for (int i = 0; i < n; i++) {
            arr[i]=scanner.nextInt();
        }
        long res=-1;
        for (int i = 0; i < n-1; i++) {
            res=Math.max(res,arr[i]*arr[i+1]);
        }
        //在原有数组的基础上将任意  两个相邻的  两个数字进行交换,得到乘积的最大值
        for (int i=0;i<n-1;i++){
            long left=(i>0)?arr[i-1]*arr[i+1]:0;
            long right=(i<n-2)?arr[i+1]*arr[i+2]:0;
            res=Math.max(res,Math.max(left,right));
        }

        System.out.println(res);
        scanner.close();
    }
}

第二道

package com.面试中的算法.米哈游秋招;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * @author xing'chen
 * @version 1.0
 * @description:
 *
 * 商店里有 n个商品,分别编号为 1~n ,每个商品都有一个价值 vali和体积 wi,米小游有一个有一个 m 容量的背包,
 * 他能够装得下任意多个体积之和不超过 m 的商品。
 *
 * 米小游认为有些东西一起购买会带来灾难,比如可莉的角色立牌和蹦蹦炸弹的小手办,所以他设定了 k组互斥关系,
 * 每组关系给定两个数字 a,b,表示编号为 a 的商品和编号为 b的商品不能同时购买。
 *
 * 米小游希望装下的物品的价值之和最大,请你帮帮他求出最大价值。
 *
 * 输入描述
 *
 * 第一行输入三个整数 n,m,k(1<=n<=15;1<=m<=10^9;0<=k<=15)表示商品数量、背包容量和互斥关系数量。
 *
 * 接下来 n行,每行输入两个整数 wi,vali(1<=wi,vali<=10^9) 表示每个物品的体积和价值。
 *
 * 接下来 k行,每行输入两个整数 a,b(1<=a,b<=n,a≠b),描述一组互斥关系。
 *
 * 输出描述
 *
 * 在一行上输出一个整数表示答案。
 * @date 2024/8/3 20:52
 */
public class MAIN2 {



    private static int n,m,k;
    private static int[][] arr;
    private static Set<Integer>[] ans;
    private static int res=0;

    private static boolean check(int i,Set<Integer> les){
        for(int a:les){
            if(ans[a].contains(i)){
                return false;
            }
        }return true;
    }



    private static void backend(int i,int currValue,int currWeight,Set<Integer> les){
        if(i>=n){
            res=Math.max(res,currValue);
            return;
        }
        backend(i+1,currValue,currWeight,les);
        //不是互斥关系且重量满足就可以计算该数据然后回溯重新计算,直到找到最大值
        if(check(i,les)&&currWeight+arr[i][0]<=m){
            les.add(i);
            backend(i+1,currValue+arr[i][0],currWeight+arr[i][0],les);
            les.remove(i);
        }
    }

    //对数据进行数据结构的选择,之后进行赋值

    public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
         n= in.nextInt();
         m=in.nextInt();
         k=in.nextInt();
         arr=new int[n][2];
         ans=new HashSet[n];
         //商品的重量和价值的初始化
        for (int i = 0; i < n; i++) {
            arr[i][0]=in.nextInt();
            arr[i][1]=in.nextInt();
        }
        for (int i = 0; i < n; i++) {
            ans[i]=new HashSet<>();
        }
        for (int i=0;i<k;i++){
            int a=in.nextInt()-1;
            int b=in.nextInt()-1;
            ans[a].add(b);
            ans[b].add(a);
        }
        Set<Integer> les=new HashSet<>();
        backend(0,0,0,les);
        System.out.println(res);
        in.close();

//        int[] dp=new int[n+1];
//
//        //互斥表的序号为n的序号
//        //相当于给了一串商品,除去互斥关系之后,在剩下的商品中获得价值之和最大,且体积小于等于m
//        dp[0]=arr[0][1];//初始为第一个商品的价值
//        for (int j = 0; j < k; j++) {
//            for (int i = 0; i < n; i++) {
//                if(ans[j][0]==i&&ans[j][1]!=i+1) {
//                    dp[i + 1] = arr[i][1] + arr[i + 1][1];
//                }else if(ans[j][0]==i&&ans[j][1]==i+1){
//                    dp[i+1]=Math.max(dp[i+1],dp[i]);
//                }
//            }
//        }
//        System.out.println(2*dp[n-1]);
    }
}

第三道

package com.面试中的算法.米哈游秋招;

import java.util.*;

/**
 * @author xing'chen
 * @version 1.0
 * @description:
 * 米小游和派蒙在进行一场游戏。游戏在一个基环树(点数与边数相等的无向简单连通图)上进行,定义图中一个点的度数为与其相连的边数,
 * 二人轮流进行以下操作:
 *
 * ● 选择图中一个度数为 1 的点,删除这个点以及与这个点相连的边。
 *
 * 图中有一个特殊的点 x ,删除了点 x 的玩家即获得胜利。
 *
 * 现在,由米小游先进行操作。在双方都采取最优策略的情况下,胜者是谁?
 *
 * 输入描述
 *
 * 每个测试文件均包含多组测试数据。第一行输入一个整数 T(1<=T<=1000) 代表数据组数,每组测试数据描述如下:
 *
 * 第一行输入两个整数 n,x(3<=n<=10^5, 1<=x<=n) 表示图的点数及特殊点的编号。
 *
 * 此后 n 行,第 i 行输入两个整数 ui 和 vi (1<=vi,ui<=n ; ui!=vi) 表示树上第 i 条边连接节点 ui 和 vi 。保证图联通,没有重边。
 *
 * 除此之外,保证给定的边构成一个基环树,所有的 n 之和不超过 2*10^5 。
 *
 * 输出描述
 *
 * 对于每一组测试数据,在一行上输出胜者的名字( Xiaoyo 或 Pyrmont )。特别地,若点 x 不可能被删除,请输出 Draw 。
 * @date 2024/8/7 11:04
 */
public class MAIN3 {
    private static void solve() {
        int n = sc.nextInt();
        int x = sc.nextInt();

        List<List<Integer>> graph = new ArrayList<>(n + 1);
        //初始化数组
        for (int i = 0; i <= n; ++i) {
            graph.add(new ArrayList<>());
        }

        int[] indegre = new int[n + 1];
        for (int i = 0; i < n; ++i) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            graph.get(a).add(b);
            graph.get(b).add(a);
            indegre[a]++;
            indegre[b]++;
        }

        Deque<Integer> q = new ArrayDeque<>();
        for (int i = 1; i <= n; ++i) {
            if (indegre[i] == 1) {
                if (i == x) {
                    System.out.println("Xiaoyo");
                    return;
                }
                q.add(i);
            }
        }

        int cnt = 0;
        boolean flg = false;
        while (!q.isEmpty()) {
            int node = q.poll();
            cnt++;
            if (node == x) {
                flg = true;
                continue;
            }
            for (int next : graph.get(node)) {
                indegre[next]--;
                if (indegre[next] == 1) {
                    q.add(next);
                }
            }
        }

        if (!flg) {
            System.out.println("Draw");
        } else if (cnt % 2 == 0) {
            System.out.println("Pyrmont");
        } else {
            System.out.println("Xiaoyo");
        }
    }
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        int T = sc.nextInt();
        for (int i = 0; i < T; ++i) {
            solve();
        }
        sc.close();
    }
}
#米哈游求职进展汇总#
全部评论

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务