牛客编程巅峰赛S2第8场 - 钻石&王者 题解

A题:
发现n的范围只有20,所以暴力枚举每一个物品取或者不取,作者用二进制状态压缩来解决此问题。
代码如下:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回总体积为V若干物品的最大总重量,如果g存在选择若干物品总体积为V的情况,返回-1
     * @param v int整型vector 
     * @param g int整型vector 
     * @param V int整型 
     * @return int整型
     */
    int Maximumweight(vector& v, vector& g, int V) {
        int n=v.size(),ans=-1;
        for(int i=0;i<(1<<n);i++){
            int s=0,t=0;
            for(int j=0;j<n;j++)
                if(i>>j&1){
                    s=s+v[j];
                    t=t+g[j];
                }
            if(s==V)ans=max(ans,t);
        }
        return ans;
    }
};

时间复杂度 O(2^n)

B题:
最大前缀与最大后缀匹配,就是KMP中的next[len]的定义,所以直接套用模板即可。
代码如下:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 给定一个字符串s,返回具有相同前缀后缀的子串的第二大长度,反之,返回-1即可。
     * @param s string字符串 代表题意中的字符串s
     * @return int整型
     */
    int nxt[1000010];
    int solve(string s) {
        int n=s.size();
        s=" "+s;
        for(int i=2,j=0;i<=n;i++){
            while(j&&s[i]!=s[j+1])j=nxt[j];
            if(s[i]==s[j+1])j++;
            nxt[i]=j;
        }
        if(nxt[n]==0)return -1;
        else return nxt[n];
    }
};

时间复杂度 O(n)

C题:
发现与普通的最短路不同,它的路程是乘起来的,所以中途可能会出现极大的数字但又不能取模。
所以,我们使用对数的一个性质log(a)+log(b)=log(a*b),讲乘法改为加法。
但是又有一个新的问题,long long的数值太小,无法预处理1000以内的组合数,但是我们有double啊,它的范围几乎刚刚包含1000以内最大的组合数,所以就用double存储,在跑最短路的同时,为了方便我们还可以同时记录最终的答案。
代码如下:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n int整型 有n个城市
     * @param m int整型 有m条路径
     * @param s int整型 起始城市坐标
     * @param t int整型 终点城市坐标
     * @param edge int整型vector> 边的格式如下:[[u1,v1,a1,b1],[u2,v2,a2,b2],...]
     * @return int整型
     */
    long long M=(1e9)+7,f[510][510],g[510][510],jc2[1010][1010],dis[510],dis2[510],vis[510];
    double jc[1010][1010];
    int minDist(int n, int m, int s, int t, vector >& edge) {
        for(int i=0;i<=1000;i++){
            jc[i][0]=1;
            jc2[i][0]=1;
            for(int j=1;j<=i;j++){
                jc[i][j]=jc[i-1][j]+jc[i-1][j-1];
                jc2[i][j]=(jc2[i-1][j]+jc2[i-1][j-1])%M;
            }
        }
        memset(f,0x3f,sizeof(f));
        for(int i=1;i<=n;i++)f[i][i]=0;
        for(int i=0;i<m;i++){
            int u=edge[i][0],v=edge[i][1],a=edge[i][2],b=edge[i][3];
            f[u][v]=f[v][u]=log(jc[a][b]);
            g[u][v]=g[v][u]=jc2[a][b];
        }
        memset(dis,0x3f,sizeof(dis));
        dis[s]=0;
        dis2[s]=1;
        for(int i=1;i<=n;i++){
            int nw=0;
            for(int j=1;j<=n;j++)
                if(!vis[j]&&dis[j]<dis[nw])nw=j;
            vis[nw]=true;
            if(nw==t)break;
            for(int j=1;j<=n;j++)
                if(!vis[j]&&dis[nw]+f[nw][j]<dis[j]){
                    dis[j]=dis[nw]+f[nw][j];
                    dis2[j]=dis2[nw]*g[nw][j]%M;
                }
        }
        return dis2[t];
    }
};

时间复杂度 O(n^2)

#题解#
全部评论

相关推荐

03-13 00:04
已编辑
吉林大学 Java
约面的挺突然。。狠下心接了1.自我介绍2.讲讲JAVA的反射3.可以继续讲讲AOP,动态代理[&nbsp;因为讲反射不小心吟唱到了例如AOP的动态代理,但是这块记忆的非常不熟,结果磕磕绊绊&nbsp;]4.项目我看你写了AOP和注解,具体怎么实现滑动窗口限流的[&nbsp;梦到什么说什么,吟唱八股发散千万不要散到自己不熟悉的区域&nbsp;]5.也讲讲为什么另一个项目选择令牌桶,具体流程6.&nbsp;OK,讲讲&nbsp;Redis&nbsp;的数据类型?还有吗?就了解这五种嘛[&nbsp;把5个的基础类型从应用对比到历届底层全都吟唱了一遍。一句还有吗直接没力气了,简历就写了理解5种,别的我是真一点没看TT&nbsp;]7.讲讲Redission分布式锁实现8.这个指数退避怎么实现的9.在这里有考虑去保障幂等性嘛10.这里为什么使用指数退避呢?&nbsp;什么时候用均匀重传[已经晕过去了说不了解,刚说了后就意识到,估计应该说指数退避能缓解压力防止下游服务器雪崩之类的]11.ok,那讲讲JMM12.讲讲RocketMQ如何保证的不丢消息13.讲讲RocketMQ延迟消息原理14.讲讲项目Redis实现会话记忆这一块15.如果ai调用function&nbsp;calling出现幻觉,有考虑怎么解决吗?[&nbsp;不了解,面试官说什么接口幂等化,高危操作人工防护,没在听,感觉人已经飞升了TT&nbsp;]16.mcp了解嘛?和function&nbsp;calling有什么区别[&nbsp;依旧不了解,只能说了个前者规范架构抽象解耦,后者耦合高只能算个工具调用]17.AI生成代码的代码质量怎么保障,那平时如何review的呢18.算法。lc215&nbsp;&nbsp;数组中最大第k个元素19.打算考研还是本科就业20.反问1️⃣有哪里不足,有哪些需要提高的部分。[主要说知识广度不够,多刷算法,让我别太紧张]2️⃣部门业务会做什么人生第二次面试。感觉大厂面试官的气场压力很大应该凉了不过这次面试非常锻炼心态,多面试,多面试。
Luxlord:面经太硬核了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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