美团笔试AK 8.12

整体难度不大,6000hc可信度极高,冲团子就完事了

第一题思路:用mp存下标,然后判断是否相邻即可

#include <iostream>
#include <map>
#include <unordered_map>
using namespace std;
unordered_map<int,int>mp;
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        int w;cin>>w;
        mp[w]=i;
    }
    int x,y;
    cin>>x>>y;
    if(abs(mp[x]-mp[y])==1){
        cout<<"Yes"<<endl;
    }else cout<<"No"<<endl;
}

第二题思路:看是否有从n~1的通路,然后判断逆时针快还是顺时针快就好了

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const int N = 1e5+5;
ll k[N];
int main(){
    ll sum=0;
    ll lesum=0;
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>k[i];
        sum+=k[i];
    }
    int x,y;cin>>x>>y;
    if(y>=x){
        for(int i=x;i<y;i++){
            lesum+=k[i];
        }
    }else{
        for(int i=y;i<x;i++){
            lesum+=k[i];
        }
    }
    // cout<<lesum<<' '<<sum-lesum<<endl;
    ll ans=min(lesum,sum-lesum);
    cout<<ans<<endl;
}

第三题思路:求横向纵向的前缀和

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 1e3+5;
ll k[N][N];
ll sumN[N][N];
ll sumM[N][N];
int main(){
    int n,m;
    cin>>n>>m;
    ll allsum=0;
    memset(sumN,0,sizeof(sumN));
    memset(sumM,0,sizeof(sumM));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>k[i][j];
            allsum+=k[i][j];
        }
    }
    ll ans=allsum;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            sumN[i][j]=sumN[i][j-1]+k[i][j];
        }
    }
    // for(int i=1;i<=n;i++){
    //     for(int j=1;j<=m;j++){
    //         cout<<sumM[i][j]<<' ';
    //     }cout<<endl;
    // }
    for(int i=1;i<m;i++){
        ll lesum=0;
        for(int j=1;j<=n;j++){
            lesum+=sumN[j][i];
        }
        ans=min(ans,abs(allsum-lesum-lesum));
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            sumM[i][j]=sumM[i-1][j]+k[i][j];
        }
    }
    // for(int i=1;i<=n;i++){
    //     for(int j=1;j<=m;j++){
    //         cout<<sumM[i][j]<<' ';
    //     }cout<<endl;
    // }
    for(int i=1;i<n;i++){
        ll lesum=0;
        for(int j=1;j<=m;j++){
            lesum+=sumM[i][j];
        }
        // cout<<lesum<<endl;
        ans=min(ans,abs(allsum-lesum-lesum));
    }
    cout<<ans<<endl;
}

第四题思路:先处理成连通块,然后就是油田问题了

#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1e4+5;
vector<string>v[N];
string target;
string mapInfo[N];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int lastans;
void dfs(int n,int m,int x,int y,vector<vector<int> >&vis){
    vis[x][y]=1;
    for(int i=0;i<4;i++){
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        if(xx<0||xx>=n||yy<0||yy>=m){
            continue;
        }
        if(vis[xx][yy]==1){
            continue;
        }
        if(mapInfo[xx][yy]==mapInfo[x][y]){
            dfs(n,m,xx,yy,vis);
        }
    }
}
void calculate(int hang,int lie){
    int n=hang;
    int m=lie;
    vector<vector<int> >vis;
    for(int i=0;i<n;i++){
        vector<int>temp;
        for(int j=0;j<m;j++){
            temp.push_back(0);
        }
        vis.push_back(temp);
    }
    int ans=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(vis[i][j]==0){
                dfs(n,m,i,j,vis);
                ans++;
            }
        }
    }
    lastans=min(lastans,ans);
    // cout<<ans<<endl;
}
void desolve(string target,int hang,int lie){
    
    int hanglen=target.length()/hang;
    int beindex=0;
    for(int i=0;i<hang;i++){
        string temp;
        temp=target.substr(beindex,hanglen);
        beindex+=hanglen;
        mapInfo[i]=temp;
    }
    calculate(hang,lie);
}
int main(){
    int n;cin>>n;
    cin>>target;
    lastans=n;
    for(int i=1;i<=n;i++){
        if(n%i==0){
            desolve(target,i,n/i);
        }
    }
    cout<<lastans<<endl;
}

第五题思路:优先判断叶子结点,通过一个队列来维护就好了

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#define ll long long
#define ull unsigned long long
const int N = 1e5+5;
using namespace std;
vector<int>ve[N];
int du[N];
ll val[N];
int vis[N];
queue<int>q;
int n;
int ans;
bool judge(int index1,int index2){
    ull tar=val[index1]*val[index2];
    ull use=sqrt(tar);
    if(tar==use*use){
        return true;
    }else{
        return false;
    }
    
}
void solve(int index){
    int flag=0;
    int tar=0;
    for(int i=0;i<ve[index].size();i++){
        if(vis[ve[index][i]]==1)continue;
        if(judge(index,ve[index][i])==true){
            // cout<<123123<<endl;
            flag=1;
            tar=ve[index][i];
            break;
        }
    }
    if(flag==1){
        vis[index]=1;
        vis[tar]=1;
        for(int i=0;i<ve[index].size();i++){
            du[ve[index][i]]--;
            if(du[ve[index][i]]==1&&vis[ve[index][i]]==0){
                // cout<<"aaa"<<endl;
                q.push(ve[index][i]);
            }
        }
        for(int i=0;i<ve[tar].size();i++){
            du[ve[tar][i]]--;
            if(du[ve[tar][i]]==1&&vis[ve[tar][i]]==0){
                // cout<<"bbb"<<endl;
                q.push(ve[tar][i]);
            }
        }
        ans+=2;
    }else{
        vis[index]=1;
        for(int i=0;i<ve[index].size();i++){
            du[ve[index][i]]--;
            if(du[ve[index][i]]==1&&vis[ve[index][i]]==0){
                q.push(ve[index][i]);
            }
        }
    }
}
int main(){
    memset(vis,0,sizeof(vis));
    ans=0;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>val[i];
    }
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        ve[u].push_back(v);
        ve[v].push_back(u);
        du[u]++;
        du[v]++;
    }
    for(int i=1;i<=n;i++){
        if(du[i]==1){
            q.push(i);
        }
    }
    while(!q.empty()){
        int w=q.front();q.pop();
        // cout<<w<<endl;
        if(vis[w]==0){
            solve(w);
        }
        // cout<<w.index<<' '<<w.du<<endl;
    }
    cout<<ans<<endl;
}

全部评论
举报了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,抑郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上6点起床晚上11点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里😭😭😭我真的😭我要嫉妒疯了😭为什么!!为什么这个人不是我😡我求你了😭求你了😭!不要在发了,我真的要羡慕嫉妒疯了😱怎么办我要嫉妒死了啊啊啊啊我急了,手机电脑全砸了,本来就有抑郁症的我,被别人说我破防了,我真的恼羞成怒了,仿佛被看穿了,躲在网络背后的我,这种感觉真的好难受,我被看穿的死死地,短短的破防两个字,我伪装出来的所有的坚强和强颜欢笑全都崩塌了,成了一个被人笑话的小丑🤡,我真的不想再故作坚强了,玩心态我输的什么都不剩😭😭😭
14 回复 分享
发布于 2023-08-12 17:07 北京
6000hc,技术序列你猜猜占多少
6 回复 分享
发布于 2023-08-12 12:23 四川
第四个50%,看完发现自己沙雕了,自作聪明限定了循环是长度开方。。。。
6 回复 分享
发布于 2023-08-12 12:30 陕西
第五题我用贪心96.67,有一个case没过
4 回复 分享
发布于 2023-08-12 12:26 浙江
2 回复 分享
发布于 2023-08-12 12:27 香港
1 回复 分享
发布于 2023-08-12 12:09 甘肃
点赞 回复 分享
发布于 2023-08-12 12:07 北京
点赞 回复 分享
发布于 2023-08-12 12:09 上海
佬,最后一个题实际上就是先染叶子节点,染完了再染非叶子节点是吧
点赞 回复 分享
发布于 2023-08-12 12:09 四川
请问下第五题为什么优先考虑染红叶子节点呀?不是两个节点都被染红吗?不太明白先后体现在哪里
点赞 回复 分享
发布于 2023-08-12 12:15 加拿大
6000hc是什么意思大佬
点赞 回复 分享
发布于 2023-08-12 12:21 浙江
m
点赞 回复 分享
发布于 2023-08-12 12:21 广东
点赞 回复 分享
发布于 2023-08-12 12:25 广东
人与人的差距是真大啊,最后一题我是一点思路没有,出来这边题解都写好了。
点赞 回复 分享
发布于 2023-08-12 12:28 重庆
这就是大佬的实力嘛,我就做出来三个
点赞 回复 分享
发布于 2023-08-12 14:42 北京
秒啊第五题,贪心也阔以啊
点赞 回复 分享
发布于 2023-08-12 15:08 山东
m
点赞 回复 分享
发布于 2023-08-12 18:31 天津
可以考虑一下荣耀,南京和上海这边hc相对充足,https://www.nowcoder.com/share/jump/21920518161347041
点赞 回复 分享
发布于 2023-08-12 20:51 江苏
点赞 回复 分享
发布于 2023-08-12 21:13 陕西
2.3题用例只能过一半
点赞 回复 分享
发布于 2023-08-13 09:58 陕西

相关推荐

周述安:这都能聊这么多。别人要是骂我,我就会说你怎么骂人?他要是继续骂我,我就把评论删了。
点赞 评论 收藏
分享
28 125 评论
分享
牛客网
牛客企业服务