2024得物春季笔试真题

本文为原创内容,转载请注明出处并附带原文链接。感谢您的尊重与支持!

你必须非常努力,才能看起来毫不费劲。


1.开幕式排练

题目描述

导演在组织进行大运会开幕式的排练,其中一个环节是需要参演人员围成一个环形。演出人员站成了一圈,出于美观度的考虑,导演不希望某一个演员身边的其他人比他低太多或者高太多。

现在给出n个参演人员的身高,问在他们站成一圈时,相邻演员的身高差的最大值至少是多少? 请你帮忙计算。

输入描述

输入包括两行,第一行有1个正整数,代表人数 n。

第二行有n个空格隔开的正整数h表示第i个演员的身高。

数据保证2 <= n <= 1e5, 1 <= hi <= 1e9。

输出描述

输出包括一个正整数,表示答案。

输入示例

5
2 1 1 3 2

输出示例

1

提示信息

样例中按照1, 2, 3, 2, 1排列即可。

时间限制:c/c++/go:1s;其他语言:3s。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
int[] nums = new int[count];
for (int i = 0; i < count; i++) {
nums[i] = sc.nextInt();
}


Arrays.sort(nums);
int n = nums.length;
int res = nums[1] - nums[0];
for (int i = 0; i + 2 < n; i += 2) {
res = Math.max(res, nums[i + 2] - nums[i]);
}
for (int i = 1; i + 2 < n; i += 2) {
res = Math.max(res, nums[i + 2] - nums[i]);
}

System.out.println(res);
}
}

2.最少数字

题目描述

小明用计算机随机生成了N个正整数,他希望从这N个数中选取若千个数,使得它们的和等于M。这些随机生成的数字可能会相同,但是每个数字最多只允许使用一次。

当然这样的选取方案可能不存在,也可能有多个。现在希望你编写一个程序,能够找出数字个数最少的选取方案,输出对应的最少数字的个数,如果无解输出“No solution”。

输入描述

单组输入,每组输入2行。

第1行包含两个正整数N和M,分别表示初始输入的正整数个数和目标数字和(1 <= N <= 1e3,1 <= M <= 1e5)。

第2行为N个正整数,两两之间用空格隔开(每一个正整数均小于等于1e5)。

输出描述

输出数字个数最少的选取方案中所包含的最少数字个数,如果无解输出“No solution”。(注意:你不需要输出引号)

输入示例

5 5
1 3 2 1 1

输出示例

2

提示信息

选择3和2即可得到5,一共选择了两个数,所以答案是2,并且不存在更少的数。

时间限制:c/c++/go:1s;java:3s;其他语言:18s。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*;

public class Main {
public static void main(String[] args) {
// 这道题用一位滚动数组可以优化~
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
int target = sc.nextInt();
int[] arr = new int[count];
for (int i = 0; i < count; i++) {
arr[i] = sc.nextInt();
}

// 使用二维数组
int[][] dp = new int[count + 1][target + 1];
for (int i = 0; i <= count; i++) {
Arrays.fill(dp[i], target);
}
dp[0][0] = 0;

for (int i = 1; i <= count; i++) {
for (int j = 0; j <= target; j++) {
dp[i][j] = dp[i - 1][j]; // 不选择当前物品
if (j >= arr[i - 1]) {
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - arr[i - 1]] + 1);
}
}
}

System.out.println(dp[count][target] == target ? "No solution" : dp[count][target]);
}
}