OD统一考试(D卷)
分值: 200分
题解: Java / Python / C++
题目描述
某部门计划通过结队编程来进行项目开发,已知该部门有 N 名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程,结队分组规则如下:
从部门中选出序号分别为 i、j、k 的3名员工,他们的职级分别为 level[i],level[j],level[k],结队小组满足 level[i] < level[j] < level[k] 或者 level[i] > level[j] > level[k],其中 0 ≤ i < j < k < n。
请你按上述条件计算可能组合的小组数量。同一员工可以参加多个小组。
输入描述
第一行输入:员工总数 n
第二行输入:按序号依次排列的员工的职级 level,中间用空格隔开
备注:
1 <= n <= 6000
1 <= level[i] <= 10^5
输出描述
可能结队的小组数量
示例1
输入:
4
1 2 3 4
输出:
4
说明:
可能结队成的组合(1,2,3)、(1,2,4)、(1,3,4)、(2,3,4)
示例2
输入:
3
5 4 7
输出:
0
说明:
根据结队条件,我们无法为该部门组建小组
题解
这个问题可以通过最简单的暴力方式遍历每个可能的三人组合,然后检查他们的职级是否符合条件来解决。
最简单的暴力解法是三重循环,时间复杂度为O(n^3),虽然对于最大值6000可能会超时,但是可以获得大多数分数(Python 可以AC90%)。
代码注释:
- 首先读取员工数量
n
和他们的职级列表level
。- 初始化计数器
ans
,用于记录满足条件的组合数量。- 三重循环遍历所有可能的三人组合:
- 外层循环
i
从0到n-1
。- 中层循环
j
从i+1
到n-1
。- 内层循环
k
从j+1
到n-1
。- 在最内层循环中,检查
level[i]
、level[j]
、level[k]
是否满足level[i] < level[j] < level[k]
或者level[i] > level[j] > level[k]
。- 若满足条件,则将计数器
ans
加1。- 最后输出满足条件的组合数量
ans
。
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] level = new int[n];
for (int i = 0; i < n; i++) {
level[i] = scanner.nextInt();
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
if ((level[i] < level[j] && level[j] < level[k]) || (level[i] > level[j] && level[j] > level[k])) {
ans += 1;
}
}
}
}
System.out.println(ans);
}
}
Python
n = int(input())
level = list(map(int, input().split()))
ans = 0
for i in range(n):
for j in range(i+1, n):
for k in range(j+1, n):
if level[i] < level[j] < level[k] or level[i] > level[j] > level[k]:
ans += 1
print(ans)
# 简单暴力解法 AC 90%
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> level(n);
for (int i = 0; i < n; ++i) {
cin >> level[i];
}
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
if ((level[i] < level[j] && level[j] < level[k]) || (level[i] > level[j] && level[j] > level[k])) {
++ans;
}
}
}
}
cout << ans << endl;
return 0;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏