9.4美团笔试

AC1235,4题目看错了,以为是01矩阵求四边形,样例没看写了半天ac9%,尬住了

01思路

状态转移方程

a[i][0][0]=(a[i-1][0][1]+a[i-1][0][0])%mod;//表示当前aa状态只能由前面aa或者ab继承
a[i][0][1]=(a[i-1][1][1])%mod;//表示当前ab状态只能由前面bb继承
a[i][1][1]=(a[i-1][1][1]+a[i-1][1][0])%mod;//表示当前bb状态只能由前面ba或者bb继承
a[i][1][0]=(a[i-1][0][0])%mod;//表示当前ba状态只能由前面aa继承

02思路

建图,跑弗洛伊德,一开始91%,然后想到没跑到的可能输出0,然后还是91%,还好看了公告没跑到的-1

建图:先把每个线路能通过的点,放一块,表示这些点到点的距离是1

代码

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define mod 998244353
#define inf 0x3f3f3f3f
using namespace std;
const int N=500+10;
int ans[N][N];
int n,m;
vector<int>a[N];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int num;scanf("%d",&num);
        for(int j=0;j<num;j++){
            int u;scanf("%d",&u);
            a[u].push_back(i);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) ans[i][j]=0;
            else ans[i][j]=inf;//初始化
        }
    }
    for(int i=1;i<=m;i++){
        int x=a[i].size();
        for(int j=0;j<x;j++){
            for(int k=j+1;k<x;k++){
                ans[a[i][j]][a[i][k]]=1;
                ans[a[i][k]][a[i][j]]=1;//建图
            }
        }
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(ans[i][j]>ans[i][k]+ans[k][j]){
                    ans[i][j]=ans[i][k]+ans[k][j];//弗洛伊德
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
           if(ans[i][j]==inf){
            ans[i][j]=-1;//没走到的标记为-1
           }
        }
    }
     for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf(j==n?"%d\n":"%d ",ans[i][j]);
        }
    }
    return 0;
}

3思路

全场最简单题,核心代码

for(int i=n-1;i>=0;i--){
    if(s[i]=='c')num++;//num表示c的个数
    else sum+=num;//sum表示移动次数
}

04思路

最后十分钟没想好怎么去重,跑了一个dfs,求一个04思路(评论区两大牛,两个猛男思路)

05思路

前缀和+线段树求区间最小最大值

ac代码

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define mod 998244353
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+10;
ll trmin[N*4],trmax[N*4];
ll sum[N];
int n,m,id=0;
ll a[N];
void pushup(int x){
    trmin[x]=min(trmin[x<<1],trmin[x<<1|1]);
    trmax[x]=max(trmax[x<<1],trmax[x<<1|1]);
}
void build(int x,int l,int r){
    if(l==r){
        trmin[x]=a[l];
        trmax[x]=a[l];//cout<<a[l]<<endl;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
ll querymx(int x,int l,int r,int l1,int r1){
    if(l1<=l && r<=r1){
        return trmax[x];
    }
    int mid=(l+r)>>1;
    ll zhi=0;
    if(l1<=mid){
        zhi=max(zhi,querymx(x<<1,l,mid,l1,r1));
    }
    if(r1>mid){
        zhi=max(zhi,querymx(x<<1|1,mid+1,r,l1,r1));
    }
    return zhi;
}
ll querymi(int x,int l,int r,int l1,int r1){
    if(l1<=l && r<=r1){
        return trmin[x];
    }
    int mid=(l+r)>>1;
    ll zhi=10000000100;
    if(l1<=mid){
        zhi=min(zhi,querymi(x<<1,l,mid,l1,r1));
    }
    if(r1>mid){
        zhi=min(zhi,querymi(x<<1|1,mid+1,r,l1,r1));
    }
    return zhi;
}
int main(){
    sum[0]=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];
    }
    build(1,1,n);
    ll sumx=0;
    for(int i=1;i<=n-m+1;i++){
        ll mi=querymi(1,1,n,i,i+m-1),mx=querymx(1,1,n,i,i+m-1);
        ll xx=sum[i+m-1]-sum[i-1]-mi-mx;
        if(xx>sumx) id=i,sumx=xx;
    }
    printf("%d\n",id);
    return 0;
}
/*
10 3
14 24 14 22 44 29 33 45 36 48
*/
#美团##C/C++#
全部评论
第5题是滑动窗口最大最小值,单调队列
1 回复 分享
发布于 2021-09-04 18:25
第四题,输入的那个矩阵开四次方,每个点ai,j就代表i点走四步可以到达j的路线数,所以统计i从1到n所有a(i,i)的和(四边形就是从一个点走四步回到原点),但是走四步回原点还有可能是两个点来回走和三个点来回走,所以要减去,用原矩阵开二次方,遍历所有点,如果i=j,就减去a(i,j)的平方,否则减去a(i,j)
1 回复 分享
发布于 2021-09-04 18:37
第四题,枚举累计以i,j节点为对角节点的四边形个数(相同邻居节点个数为m,则以i,j节点为对角节点的四边形个数为组合数Cm2),因为一个四边形有两个对角,所以会重复计算一次。
1 回复 分享
发布于 2021-09-04 18:41
第一题全场最简单,就是个斐波那契
点赞 回复 分享
发布于 2021-09-04 18:16
其他都不会,哭了
点赞 回复 分享
发布于 2021-09-04 18:16
大佬别卷了😂
点赞 回复 分享
发布于 2021-09-04 18:19
这第三题的解法妙啊
点赞 回复 分享
发布于 2021-09-04 19:03
请问你是后台还是算法岗 笔试只有编程题吗
点赞 回复 分享
发布于 2021-09-24 22:35

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
6 8 评论
分享
牛客网
牛客企业服务