一、题目 §
在某个项目中有多个任务(用task数组表示)需要你进行处理,其中:
task[i] = [si, ei]
你可以在 si ≤ day ≤ ei 中的任意一天处理该任务,请返回你可以处理的最大任务数。
注:一天可以完成一个任务的处理。
二、输入 §
第一行为任务数量 n
1 ≤ n ≤ 100000
后面 n 行表示各个任务的开始时间和终止时间,使用 si,ei 表示
1 ≤ si ≤ ei ≤ 100000
三、输出 §
输出为一个整数,表示可以处理的最大任务数。
四、示例 §
输入:
3
1 1
1 2
1 3
输出:
3
五、题解 §
- 题目中“一天可以完成一个任务的处理”意思是“一天只能处理一个任务”
- 为了处理尽量多的任务,先处理结束时间早的任务,这样剩下的任务更有机会被执行。考虑贪心算法
- Python 提供了 2 种实现
- Kimi,文心一言、通义千问都把题意理解错误了。把[si,ei]错误理解为任务的执行开始时间和结束时间了而不是[si,ei]间的任意一天。通义千问可根据提示信息最终回答正确。感觉这类平台理解能力有限,更像一个搜索引擎
5.1 Java 实现 §
package org.stone.study.algo.ex202411;
import java.util.Arrays;
import java.util.Scanner;
/**
* 可以处理的最多任务数
*/
public class MaxTasksCount {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
int[][] tasks = new int[n][2];
for (int i = 0; i < n; i++) {
String[] strArr = scanner.nextLine().split(" ");
tasks[i][0] = Integer.parseInt(strArr[0]);
tasks[i][1] = Integer.parseInt(strArr[1]);
}
int ans = maxTasksCount(n, tasks);
System.out.println(ans);
}
public static int maxTasksCount(int n, int[][] tasks) {
// 按照结束时间升序排序
Arrays.sort(tasks, (a, b) -> a[1] - b[1]);
// 执行过的最大任务数
int ans = 0;
// 当前天
int currentDay = 0;
for (int i = 0; i < n; i++) {
// 更新当前天,可以是下一天或者直接跳到当前任务开始时间
currentDay = Math.max(tasks[i][0], currentDay + 1);
// 当前任务可以执行
if(currentDay <= tasks[i][1]) {
++ans;
}
}
return ans;
}
}
5.2 Python实现 §
# 方法1
def maxTaskCount1(tasks):
# 按结束时间升序排序
tasks.sort(key=lambda x : x[1])
# 完成的任务数量
count = 0
# 记录已经使用过的时间天数
used = set()
for si, ei in tasks:
for d in range(si, ei + 1):
if d not in used:
used.add(d)
count += 1
break
return count
# 方法2
def maxTaskCount2(tasks):
# 按结束时间升序排序
tasks.sort(key=lambda x : x[1])
# 完成的任务数量
count = 0
# 记录当前时间
current_day = 0
for si, ei in tasks:
# 更新当前时间:时间可以直接跳到任务的开始时间,也可以跳到下一天。
current_day = max(si, current_day + 1)
# 当天可执行该任务
if current_day <= ei:
count += 1
return count
if __name__ == "__main__":
m = int(input())
tasks = []
for _ in range(m):
tasks.append(list(map(int, input().split())))
print(maxTaskCount1(tasks))
print(maxTaskCount2(tasks))