华为OD机试 - 项目排期(Java & JS & Python & C & C++)
题目描述:
给定一个项目数组,每个项目有一个要求的开始时间和结束时间,请计算最多可以安排的项目数量。
输入描述:
第一行输入项目的数量n(1 <= n <= 10000)。
接下来n行,每行输入两个整数,表示项目的开始时间和结束时间(时间范围从1到1000000)。
输出描述:
输出最多可以安排的项目数量。
示例:
输入:
2 3
1 4
3 5
4 6
7 8
输出:
解释:
可以安排的项目是[1, 4], [3, 5], [7, 8],总共3个。
解法:
这是一个经典的贪心算法问题。我们可以根据项目的结束时间对所有项目进行排序,然后从最早结束的项目开始安排。使用一个变量来记录当前已经安排的最晚结束时间,并在遍历项目时更新这个值。
以下是使用不同编程语言实现的解决方案:
Java 示例代码:
import java.util.Arrays;
import java.util.Comparator;
public class Main {
static class Project {
int start;
int end;
Project(int start, int end) {
this.start = start;
this.end = end;
}
}
public static void main(String[] args) {
Project[] projects = {
new Project(2, 3),
new Project(1, 4),
new Project(3, 5),
new Project(4, 6),
new Project(7, 8)
};
Arrays.sort(projects, Comparator.comparingInt(p -> p.end));
int count = 1;
int lastEnd = projects[0].end;
for (int i = 1; i < projects.length; i++) {
if (projects[i].start >= lastEnd) {
count++;
lastEnd = projects[i].end;
}
}
System.out.println(count);
}
}
JavaScript 示例代码:
function solution(projects) {
projects.sort((a, b) => a[1] - b[1]);
let count = 1;
let lastEnd = projects[0][1];
for (let i = 1; i < projects.length; i++) {
if (projects[i][0] >= lastEnd) {
count++;
lastEnd = projects[i][1];
}
}
return count;
}
// 示例
const projects = [
[2, 3],
[1, 4],
[3, 5],
[4, 6],
[7, 8]
];
console.log(solution(projects)); // 输出: 3
Python 示例代码:
def solution(projects):
projects.sort(key=lambda p: p[1])
count = 1
last_end = projects[0][1]
for p in projects[1:]:
if p[0] >= last_end:
count += 1
last_end = p[1]
return count
# 示例
projects = [[2, 3], [1, 4], [3, 5], [4, 6], [7, 8]]
print(solution(projects)) # 输出: 3
C/C++ 示例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int start;
int end;
} Project;
int cmp(const
评论已关闭