牛客编程巅峰赛S1第6场 - 黄金&钻石&王者

A 牛牛爱奇数

解题思路
这道题有两种解法,第一种是贪心的思路,我们每一次肯定优先将一些大的偶数先变小,让它与那些小的偶数相等之后,再统一变成奇数,而每一次选出当前最大的一个偶数当然要使用大根堆。

参考代码

import java.util.*;


public class Solution {
    /**
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型一维数组 代表n个数字的值
     * @return int整型
     */
    public int solve (int n, int[] a) {
        // write code here
        PriorityQueue<Integer> q = new PriorityQueue<Integer>(new Comparator<Integer>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                // TODO Auto-generated method stub
                return o2 - o1;
            }
        });

        Set<Integer> set = new HashSet<Integer>();
        for(int i=0; i<n; i++){
            if(a[i] % 2 == 0 && !set.contains(a[i])){
                set.add(a[i]);
                q.add(a[i]);
            }
        }

        int cnt = 0;
        while(!q.isEmpty()){
            int tmp = q.poll();

            tmp /= 2;
            cnt += 1;

            if(!set.contains(tmp) && tmp % 2 == 0){
                set.add(tmp);
                q.add(tmp);
            }
        }

        return cnt;
    }
}

第二种解法就是我们知道,在该转化中所有出现的偶数都要做除2的操作,由于要统计最少的步数,故这里我们让每一种偶数都只除一次2,这样最终就可以统计出所需的最少的步数。

import java.util.*;


public class Solution {
    /**
     * 返回一个数,代表让这些数都变成奇数的最少的操作次数
     * @param n int整型 代表一共有多少数
     * @param a int整型一维数组 代表n个数字的值
     * @return int整型
     */
    public int solve (int n, int[] a) {
        // write code here
        Set<Integer> set = new HashSet<Integer>();

        int cnt = 0;
        for(int i=0; i<n; i++){

            while(a[i] % 2 == 0){
                if(!set.contains(a[i])){
                    cnt += 1;
                }
                set.add(a[i]);
                a[i] /= 2;
            }
        }

        return cnt;
    }
}


B 牛牛摆放花

解题思路
这道题是一个很经典的贪心,思路就是将最大的数字放到中间,然后依次将第2大和第3大的放到两边,第4大的接在第二大的后面,第5大的接在第3大的后面,按照这样的顺序最后得到的就是一个相邻差值最小的序列。

解题思路

import java.util.*;


public class Solution {
    /**
     * ​返回按照这些花排成一个圆的序列中最小的“丑陋度”
     * @param n int整型 花的数量
     * @param array int整型一维数组 花的高度数组
     * @return int整型
     */
    public int solve (int n, int[] a) {
        // write code here
        int ans = 0;

        if(n == 1) return 0;

        Arrays.sort(a);

        for(int i=0; i+2<n; i++){
            ans = Math.max(ans, a[i + 2] - a[i]);
        }
        ans = Math.max(ans, a[n-1] - a[n - 2]);
        ans = Math.max(ans, a[1] - a[0]); 

        return ans;
    }
}


C 星球游戏

解题思路
这道题是图论问题中最短路的一个经典的应用,由于的值都很大,所以想到的最短路算法肯定有spfa或者是Dijkstra, 这里写两种方法都是可以的,这里我写的是Dijkstra算法,具体的思路就是建立一个虚拟源点,它到牛牛的所有星球的距离都为0,然后从这个虚拟源点出发求到其它各个点的最短路,最终遍历一下牛妹的所有星球,找到一个最短的返回就好了。

参考代码

import java.util.*;

class Node implements Comparable<Node>{

    int t;
    long val;

    public Node(int t, long val){
        this.t = t;
        this.val = val;
    }

    @Override
    public int compareTo(Node o) {
        // TODO Auto-generated method stub
        return Long.compare(val, o.val);
    }
}


public class Solution {
    /**
     *
     * @param niuniu int整型一维数组 牛牛占领的p个星球的编号
     * @param niumei int整型一维数组 牛妹占领的q个星球的编号
     * @param path int整型二维数组 m条隧道,每条隧道有三个数分别是ui,vi,wi。ui,vi分别是隧道的两边星球的编号,wi是它们之间的距离
     * @param nn int整型 星球个数n
     * @return int整型
     */
    int N = 100010, M = 600010, max = 0x3f3f3f3f;
    int[] h = new int[N];
    int[] dist = new int[N];
    boolean[] st = new boolean[N];
    int[] e = new int[M];
    int[] ne = new int[M];
    int[] w = new int[M];
    int idx;

    void add(int a, int b, int c){
        e[idx] = b;
        w[idx] = c;
        ne[idx] = h[a];
        h[a] = idx ++;
    }

    void dijkstra(){
        Arrays.fill(dist, max);
        dist[0] = 0;

        PriorityQueue<Node> q = new PriorityQueue<Node>();
        q.add(new Node(0, 0));

        while(!q.isEmpty()){
            Node cur = q.poll();

            int t = cur.t;
            if(st[t]) continue;
            st[t] = true;

            for(int i=h[t]; i!=-1; i=ne[i]){
                int j = e[i];

                if(dist[j] > dist[t] + w[i]){
                    dist[j] = dist[t] + w[i];
                    q.add(new Node(j, dist[j]));
                }
            }
        }
    }

    public int Length (int[] a, int[] b, int[][] e, int nn) {
        // write code here
        Arrays.fill(h, -1);

        for(int i=0; i<a.length; i++){
            add(0, a[i], 0);
            add(a[i], 0, 0);
        }

        for(int[] cur : e){
            int u = cur[0];
            int v = cur[1];
            int w = cur[2];

            add(v, u, w);
            add(u, v, w);
        }

        dijkstra();

        int res = max;
        for(int i=0; i<b.length; i++) res = Math.min(res, dist[b[i]]);

        if(res == max) return -1;
        else return res;
    }
}

这次比赛打的非常不好,写一句话鼓励一下自己吧QWQ:

全部评论

相关推荐

bg:双非本,一段中小厂6个月测开实习今天发这个帖子主要是想聊一聊我秋招以来的一个发展我是在8月底辞职,打算秋招,可是看网上都说金九银十就想着自己就是一个普通本科生,现在九月份都是一些大神在争抢,所以9月份基本上没投,等到了10月份才开始秋招,可是这个时间好像已经有些晚了,今年秋招开启的格外早,提前到了7,8月份,我十月才开始,官网投了很多公司,没有任何一个面试机会,这个情况一直到了十月底才有了第一个面试,当时没有面试经验,所以不出意外的挂了后续就是漫长的投递,但是毫无例外没有面试,没有办法我只能另辟蹊径开始在BOSS上边投递,然后顺便也根据BOSS上边这个公司名称去浏览器搜索看看有没有官网投递渠道,毕竟官网上投递后还是可以第一时间被HR看到的,然后一直不停投递,一开始第一个星期基本上都是投的正式秋招岗位到了第二个星期才开始实习和正式一起投,到十一月底的时候已经沟通了700➕才有一共1个正式的,5个要提前实习的,3个实习的面试,最后结果是过了1个要提前实习的和2个实习的每次面试我都会复盘,发现这些小公司面试官问的五花八门,有的专问基础,有的专问项目,有的啥都问,不过自己也是看出来了一下门道,就是小公司不像大公司面试官那样能力比较强基本上你简历上边的他都会,然后会根据简历来问,小公司面试官他们更多的是看自己会什么,然后看看你简历上边哪些他也是会的然后来问,经过不断的复盘加上背各种各样面试题,到了11月底12月初才有了1个要提前实习的offer还有2个实习的offer,而且薪资待遇对我来说已经很可观了可是啊,人总是这样得了千钱想万钱,我又开始不满现状,但是此时的我面试能力经过这么多面试和复盘已经很强了,然后在十二月份运气爆棚,被极兔和小鹏补录捞起来面试,还有个百度测开的实习面试,这个时候因为有了offer所以感觉有了底气,面试也很自信,最后结果是全部都过了那个时候我感觉自己真的很厉害,我问了极兔那边的HR像我这样的双非本收到offer的在极兔有多少?他告诉我产研岗90%都是硕士,10%里边基本上都是211,985,想我这样的很少很少,那一刻感觉自己超级牛逼,小鹏就更不用说了,最后也是不出意外选择了小鹏所以我就我个人经历想对和我学历履历差不多的牛友一些建议第一:秋招一定要趁早,真到了9,10月,那个时候可能你投的结果可能还不如7,8,11月,第二:最好先拿小公司实习或者正式练练手,提升一下面试能力,我个人觉得因为小公司问的五花八门所以你会更加横向去提升自己能力,而且大公司其实面试没有那么难,除了一些非常卷的岗位,公司大神比较多会问的很难,一般好点的公司都不会问的那么难,他们也知道都是应届生不会要求那么高第三:当有一定能力后,就是坚持了,对于我们这样的学历,没有特别强的履历情况下,就是要抓住提前批和补录的机会,这个时候各方面不会卡的很严,是我们很好很好的一个机会第四:就是运气也是很重要的一部分,不过这个很难去说什么最后祝各位牛友都能收获自己满意的offer😁😁😁
秋招,不懂就问
点赞 评论 收藏
分享
Cons_W:我9本的,同样找不到。感觉是岗位太少的问题,可能12月份没多少岗位的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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