奇安信笔试9.15

第一道超时  过了25%
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] s1 = scanner.nextLine().split(",");
        int[] pA = new int[s1.length];
        for (int i = 0; i < s1.length; i++) {
            pA[i] = Integer.parseInt(s1[i]);
        }
        String[] s2 = scanner.nextLine().split(",");
        scanner.close();
        int[] pB = new int[s1.length];
        for (int i = 0; i < s2.length; i++) {
            pB[i] = Integer.parseInt(s2[i]);
        }
        used = new boolean[pA.length + pB.length];
        int[] nums = new int[pA.length + pB.length];
        for (int i = 0; i < pA.length; i++) {
            nums[i] = pA[i];
        }
        for (int i = pA.length; i < pA.length + pB.length; i++) {
            nums[i] = pB[i - pA.length];
        }
        process(nums, nums.length / 2, 0);
        int min = Integer.MAX_VALUE;
        Set<List<Integer>> set = new HashSet<>();
        for (LinkedList<Integer> list : ret) {
            int cur = 0;
            List<Integer> a = new ArrayList<>();
            List<Integer> b = new ArrayList<>();
            for (int x : list) {
                if (x < pA.length) {
                    a.add(x);
                } else {
                    b.add(x);
                }
            }
            Collections.sort(a);
            Collections.sort(b);
            if (set.contains(a) && set.contains(b)) {
                continue;
            }
            set.add(a);
            set.add(b);
            if (a.size() >= 3) {
                int temp = 0;
                for (int z : a) {
                    temp += nums[z];
                }
                cur += temp * 0.6;
            } else {
                for (int z : a) {
                    cur += nums[z];
                }
            }
            if (b.size() >= 3) {
                int index = 0;
                int curMin = Integer.MAX_VALUE;
                for (int z : b) {
                    index++;
                    cur += nums[z];
                    curMin = Math.min(curMin, nums[z]);
                    if (index == 3) {
                        cur -= curMin;
                        curMin = Integer.MAX_VALUE;
                        index = 0;
                    }
                }
            } else {
                for (int x : b) {
                    cur += nums[x];
                }
            }
            min = Math.min(min, cur);
        }
        System.out.println(min);
    }

    static LinkedList<Integer> track = new LinkedList<>();
    static List<LinkedList<Integer>> ret = new ArrayList<>();
    static boolean[] used;

    public static void process(int[] nums, int n, int start) {
        if (track.size() == nums.length / 2) {
            ret.add(new LinkedList<>(track));
            return;
        }
        for (int i = start; i < nums.length; i++) {
            if (used[i]) {
                continue;
            }
            track.add(i);
            used[i] = true;
            if (i < n) {
                used[i + n] = true;
            }
            if (i >= n) {
                used[i - n] = true;
            }

            process(nums, n, start + 1);
            used[i] = false;

            if (i < n) {
                used[i + n] = false;
            }
            if (i >= n) {
                used[i - n] = false;
            }
            track.removeLast();
        }
    }
}
第二道 40%
public static int process(int[][] points) {
        if (points == null || points.length == 0) {
            return 0;
        }
        Node[] nodes = new Node[points.length];
        int index = 0;
        for (int[] nums : points) {
            nodes[index++] = new Node(nums[0], nums[1]);
        }
        Node cur = new Node(0, 0);
        return way(nodes, cur);
    }

    private static int way(Node[] nodes, Node cur) {
        Arrays.sort(nodes, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) {
                return o1.x * o1.x + o1.y * o1.y - o2.x * o2.x - o2.y - o2.y;
            }
        });
        int res = 0;
        for (int i = 0; i < nodes.length; i++) {
            Node item = nodes[i];
            res += Math.abs(item.x - cur.x) + Math.abs(item.y - cur.y);
            cur = item;
        }
        return res;
    }

    private static class Node {
        int x;
        int y;

        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }


#奇安信##奇安信23秋招笔试好难呀#
全部评论
第一题力扣hard原题,第二题暴力枚举。
点赞 回复 分享
发布于 2022-09-16 23:15 浙江
请问第一题是啥思路呀? 感觉要考虑的因素挺多的
点赞 回复 分享
发布于 2022-09-15 22:43 江苏
第一题一直想贪贪不出来,最后想回溯没时间,第二题回溯ac
点赞 回复 分享
发布于 2022-09-15 21:17 四川
太牛了。。。
点赞 回复 分享
发布于 2022-09-15 21:16 浙江

相关推荐

(黑话警告⚠️:hc=岗位数量,&nbsp;mt=导师,&nbsp;ld=直属领导,&nbsp;cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld&nbsp;找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld&nbsp;的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc&nbsp;吗?”&nbsp;ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客企业服务