美团笔试 美团笔试题 0328

笔试时间:2025年03月28日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目:小美的生物钟

小美工作得很累,现在已经是深夜,她的生物钟已经乱了!为了身体健康,她决定现在开始调整自己的生物钟。现在给定 n 天小美的工作时间,她认为作息是规律的当且仅当每天的工作时间不能超过 k。可是由于工作需要,她每天需要工作 a_i。为了身体健康,她决定在工作总时长不变的情况调休,即某天的工作量可以在另外一天完成。现在她想知道能不能完成调休使得作息是规律的,请你帮她计算一下。

输入描述

每个测试文件均包含多组测试数。

第一行输入一个整数 T(1 < T < 1000),代表数据组数,每组测试数据描述如下: 对于每一组测试数据:第一行两个整数 n,k(1 < n < 10^5,1< k< 24),表示工作天数和作息规律的时长限制。

第二行 n 个整数,第 i 个数为 a_i(1< a_i< 24),表示工作时长。 数据保证单个测试文件中 Σ n< 10^5。

输出描述

共 T 行,每行一个字符串,若能完成调休使得作息是规律的,输出 "YES",否则输出 "NO"。

样例输入

2

1 2

2

1 2

3

样例输出

YES

NO

参考题解

计算总工作时长:对于每组测试数据,计算所有工作日的总时长 S。判断可行性:若 S <= n * k,则输出 "YES";否则输出 "NO"。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int T;
    cin >> T;
    while (T--) {
        int n, k;
        cin >> n >> k;
        vector<int> a(n);
        int total = 0;
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
            total += a[i];
        }
        if (total <= n * k)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        while (T-- > 0) {
            int n = scanner.nextInt();
            int k = scanner.nextInt();
            int[] a = new int[n];
            int total = 0;
            for (int i = 0; i < n; i++) {
                a[i] = scanner.nextInt();
                total += a[i];
            }
            if (total <= n * k) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
        scanner.close();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

T = int(input())
for _ in range(T):
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    total = sum(a)
    if total <= n * k:
        print("YES")
    else:
        print("NO")

第二题

题目:数组2.0

小美有一个长度为 n 的数组 a_1,a_2,...,a_n。现在每次可以执行以下操作之一: 1.删除当前数组的第一个元素 2.删除当前数组的最后一个元素若想要数组中极差最小,求最少操作次数。【极差】数组的极差定义为数组中最大值和最小值的差。

输入描述

每个测试文件均包含多组测试数。

第一行输入一个整数 T(1< T< 1000),代表数据组数,每组测试数据描述如下: 对于每一组测试数据: 第一行一个整数 n(1< n < 10^5)。

第二行 n 个整数,第 i 个数为 a_i(1< a_i< 10^9) 数据保证单个测试文件中 Σ n <= 10^5。

输出描述

T 行,每行一个整数,表示花费的最少代价。

样例输入

2

2

1 1

2

1 2

样例输出

0

1

参考题解

找到最长的一个子数组,使得其只包含一个类型的数字。总长度减去上述步骤的数组长度即可得到答案。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        vector<int> nums(n);
        for (int i = 0; i < n; ++i) {
            cin >> nums[i];
        }

        int max_sub = 1;
        int pre = nums[0];
        int ans = 1;

        for (int i = 1; i < n; ++i) {
            if (nums[i] == pre) {
                max_sub += 1;
            } else {
                max_sub = 1;
                pre = nums[i];
            }
            ans = max(ans, max_sub);
        }

        cout << (n - ans) << endl;
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        while (T-- > 0) {
            int n = scanner.nextInt();
            int[] nums = new int[n];
            for (int i = 0; i < n; i++) {
                nums[i] = scanner.nextInt();
            }

            int maxSub = 1;
            int pre = nums[0];
 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

点赞 评论 收藏
分享
乂氼1:因为一来测试用例就是十的九次方,要使用dp数组会OOM,不用要当心重复计算太多,
投递美团等公司8个岗位 美团求职进展汇总
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客企业服务