美团笔试

美团笔试(2023/8/12)

1、小美拿到了一个排列。她想知道在这个排列中,x和y是否是相邻的。你能帮帮她吗?排列是指一个长度为n的数组,其中 1 到n 每个元素恰好出现一次。

输入描述

第一行输入一个正整数n,代表排列的长度。

第二行输入n个正整数ai,代表排列的元素。

第三行输入两个正整数x和y,用空格隔开。

保证x≠y

输出描述

如果x和y在排列中相邻,则输出"Yes"。否则输出"No"。

示例1

输入:

4

1 4 2 3

2 4

输出

Yes

示例2:

输入:

5

3 4 5 1 2

3 2

输出:

No

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    int x, y;
    bool flag = false;
    for (int i = 0; i < n - 1; i++) {
        if (nums[i] == x && nums[i + 1] == y)
            flag = true;
        if (nums[i] == y && nums[i + 1] == x)
            flag = true;
    }
    if (flag) cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}

2、有一个环形的公路,上面共有n站,现在给定了顺时针第i站到第i+1站之间的距离(特殊的,也给出了第n站到第1站的距离)。小美想沿着公路第x站走到第y站,她想知道最短的距离是多少?

输入描述

第一行输入一个正整数n,代表站的数量。第二行输入n个正整数ai,前n-1个数代表顺时针沿着公路走,i站到第i+1站之间的距离;最后一个正整数代表顺时针沿着公路走,第n站到第1站的距离。· 第三行输入两个正整数x和y,代表小美的出发地和目的地。

输出描述

一个正整数,代表小美走的最短距离。

示例1

输入

3

1 2 2

2 3

输出

2

示例2

输入

3

1 2 2

1 3

输出

2

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<long long> nums(n+1);
    long long sum =0,ans = 0;
    for(int i = 1; i<=n; i++){
        cin >> nums[i];
        sum += nums[i];
    }
    int x,y;
    cin >> x >> y;
    if(x > y) swap(x,y);
    for(int i= x; i < y; i++){
        ans += nums[i];
    }

    ans = min(ans,sum-ans);
    cout << ans << endl;
    return 0;
}

3、小美有一个矩形的蛋糕,共分成了n行m列,共n*m个区域,每个区域是一个小正方形,已知蛋糕每个区域都有一个美味度。她想切一刀把蛋糕切成两部分,自己吃一部分,小团吃另一部分。

小美希望两个人吃的部分的美味度之和尽可能接近,请你输出 |s1-s2|的最小值。(其中s1代表小美吃的美味度,s2代表小团吃的美味度)

请务必保证,切下来的区域都是完整的,即不能把某个小正方形切成两个小区域。

输入描述

第一行输出两个正整数n和m,代表蛋糕区域的行数和列数。

接下来的n行,每行输入m个正整数,用来表示每个区域的美味度。

1 <=n,m <=10^3

m个正整数均小于10^4

示例1

输入

2 3

1 1 4

5 1 0

输出:

0

#include <bits/stdc++.h>
using namespace std;
int n,m;
long long a[1005][1005];

int main() {
    cin >> n >> m;
    long long sum =0;
    for(int i =1; i<=n; i++){
        for(int j = 1; j<=m; j++){
            cin >> a[i][j];
            sum += a[i][j];
        }
    }
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            a[i][j] = a[i][j-1] +a[i-1][j] -a[i-1][j-1] +a[i][j];
        }
    }

    long long ans = sum;
    for(int j =1; j<=m; j++){
        ans = min(ans,abs(sum - 2*a[n][j]));
    }
    
    for(int i=1; i<=n; i++){
        ans = min(ans,abs(sum-2*a[i][m]));
    }

    cout << ans <<endl;

    return 0;
}

4、小美拿到了一个长度为n的字符串,她希望将字符串从左到右平铺成一个矩阵(先平铺第一行,然后是第二行,以此类推,矩阵有x行y列,必须保证x*y=n,即每y个字符换行,共x行)。

该矩阵的权值定义为这个矩阵的连通块数量。小美希望最终矩阵的权值尽可能小,你能帮小美求出这个最小权值吗?

注:我们定义,上下左右四个方向相邻的相同字符是连通的。

输入描述

第一行输入一个正整数n,代表字符串的长度。

第二行输入一个长度为n的、仅由小写字母组成的字符串。

1<=n<=10^4

输出描述

输出一个整数表示最小权值。

示例1

输入

9

aababbabb

输出

2

说明

平铺为3*3的矩阵:aababbabb共有2个连通块,4个a和5个b。

5、小美拿到了一棵树,每个节点有一个权值。初始每个节点都是白色。

小美有若干次操作,每次操作可以选择两个相邻的节点,如果它们都是白色且权值的乘积是完全平方数,小美就可以把这两个节点同时染红。

小美想知道,自己最多可以染红多少个节点?

输入描述

第一行输入一个正整数n,代表节点的数量。第二行输入n个正整数ai,代表每个节点的权值。接下来的n-1行,每行输入两个正整数u,v,代表节点u和节点v有一条边连接。

输出描述

输出一个整数,表示最多可以染红的节点数量。

示例1

输入

3

3 3 12

1 2

2 3

输出

2

#美团笔试#
全部评论
可以分享下最后一题的思路吗?
1 回复
分享
发布于 2023-08-13 01:49 浙江
第二题一样的做法但是始终只能过50%
1 回复
分享
发布于 2023-08-13 09:14 安徽
滴滴
校招火热招聘中
官网直投
大佬们笔试进度条推进了吗
1 回复
分享
发布于 2023-08-14 09:54 山东
这个笔试是什么岗位的啊?19号有美团笔试的
1 回复
分享
发布于 2023-08-16 10:51 江苏
大佬,第三题,dp[i][j]是表示的什么含义,求dp[i][j]这块没搞懂
点赞 回复
分享
发布于 2023-08-13 15:56 陕西
佬,这个题可以重复染色吗,就是a已经染过色了,但是a和b也可以染,只染b可以吗?
点赞 回复
分享
发布于 2023-08-13 20:36 陕西
大佬,第三题切蛋糕这个。abs(sum - 2*a[n][j]);为什么是减去两倍呢
点赞 回复
分享
发布于 2023-08-14 14:48 美国
请问一下这个add逻辑是啥,没看懂
点赞 回复
分享
发布于 2023-08-14 16:46 江苏
太厉害了
点赞 回复
分享
发布于 2023-08-20 14:59 安徽
牛客周赛。。。
点赞 回复
分享
发布于 2023-08-20 20:09 河北
美团什么玩意,骗人笔试,还做两次,连面试都不发,纯纯浪费时间
点赞 回复
分享
发布于 2023-08-29 10:53 陕西

相关推荐

35 147 评论
分享
牛客网
牛客企业服务