最近难得的一次AK,记录一下。    1、镜像复制    问题描述:给定n,m,k(n>=1,m>=1,k<=1e18)   根据n得到[1, 2, 3, …, n],进行m次镜像复制    每次镜像复制,例如:[1, 2, 3]->[1,2,3,3,2,1]     求m次镜像复制后第k个数     解题思路:找规律,最少镜像复制一次,从第2次开始,数组每2n个元素一次循环,即[1, 2, 3, 3, 2, 1][1, 2, 3, 3, 2, 1]。     代码:       public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int m = sc.nextInt();        long k = sc.nextLong();        int[] arr = new int[2 * n];        for(int i = 0; i < n; i++) {            arr[i] = sc.nextInt();            arr[2 * n - i - 1] = arr[i];        }        System.out.println(arr[(int)((k - 1) % (2 * n))]);    }} 2、n个数,乘积为7     问题描述:给定n个数,每个数每次操作可以+1,或-1。求最少的操作次数使得这n个数乘积为7.     解题思路:7是质数,所以最终数组会出现一个7或-7,其他均为1或-1.     首先可以把问题划分为两个问题:     1、记录每个数,正数转化为1,负数转化为-1,所需要操作数,累加的a。     2、记录每个数,正数转化为7,负数转化为-7,比1或-1少的次数,取最大值b。     3、结果=a-b。     4、特殊情况考虑,数组存在0,则不考虑负数个数的奇偶性(0变为-1和1次数相同)。     5、数组不存在0,负数为偶数也不考虑,负数为正数需要将其中一个从-1变为1,即多进行2次操作,结果为res+2.     代码:       public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] arr = new int[n];        int under = 0;        int zero = 0;        for(int i = 0; i < n; i++) {            arr[i] = sc.nextInt();            if(arr[i] < 0) {                under++;            }else if(arr[i] == 0){                zero++;            }        }        long res = 0;        int[] nums = new int[n];        int minV = Integer.MAX_VALUE;        for(int i = 0; i < n; i++) {            nums[i] = Math.min(Math.abs(arr[i] - 1), Math.abs(arr[i] + 1));            int temp = Math.min(Math.abs(arr[i] - 7), Math.abs(arr[i] + 7));            minV = Math.min(minV, temp - nums[i]);        }        for(int i = 0; i < n; i++) {            res += nums[i];        }        res += minV;        if(zero == 0 && under % 2 == 1) {            System.out.println(res + 2);        }else {            System.out.println(res);        }    }} 3、旅游,一个国家由1,2,…,n这些城市,从1出发,目的地为n。边的长度为1,花费为cost。现有一张特权卡M,花费小于M的边可以通过。求深度不超过k的情况下,M的最小值。     解题思路:深度优先搜索,城市数据量很大,使用邻接表存储。       class Node {    int id;    Map<Integer, Integer> next;    public Node(int id) {        this.id = id;        next = new HashMap<>();    }}public class Main {    private static Map<Integer, Node> nodes;    private static int k;    private static int n;    private static int minVal = Integer.MAX_VALUE;    private static Set<Integer> visited = new HashSet<>();    public static void dfs(Node loc, int maxCost, int depth) {        if(depth > k) {            return ;        }        if(loc.id == n) {            minVal = Math.min(minVal, maxCost);        }        for(Map.Entry<Integer, Integer> entry: loc.next.entrySet()) {            int key = entry.getKey();            int value = entry.getValue();            if(!visited.contains(key)) {                visited.add(key);                dfs(nodes.get(key), Math.max(maxCost, value), depth + 1);                visited.remove(key);            }        }    }    public static void main(String[] args) {        nodes = new HashMap<>();        Scanner sc = new Scanner(System.in);        n = sc.nextInt();        int m = sc.nextInt();        k = sc.nextInt();        int[][] edges = new int[m][3];        for(int i = 0; i < 3; i++) {            for(int j = 0; j < m; j++) {                edges[j][i] = sc.nextInt();            }        }        for(int i = 1; i <= n; i++) {            nodes.put(i, new Node(i));        }        for(int i = 0; i < m; i++) {            int u = edges[i][0];            int v = edges[i][1];            int w = edges[i][2];            nodes.get(u).next.put(v, w);            nodes.get(v).next.put(u, w);        }        if(n == 1) {            System.out.println(0);        }else {            dfs(nodes.get(1), Integer.MIN_VALUE, 0);            System.out.println(minVal);        }    }}   
点赞 10
评论 6
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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