2024年华为OD机试真题-执行任务赚积分

华为OD机试真题-执行任务赚积分-2024年OD统一考试(D卷)

题目描述:

现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。

每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。

可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。

输入描述:第一行为一个数N,表示有N个任务,1<=N<=100

                  第二行为一个数T,表示可用于处理任务的时间。1<=T<=100

                  接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表  示任务对应的积分。1<=SLA<=100, 0<=V<=100000

输出描述:可获得的最多积分

示例

 示例1

输入:4

           3

           1 2 

           1 3

           1 4

           1 5

输出:5

说明:虽然有3个单位的时间用于处理任务,可是所有任务在时刻1之后都无效。

          所以在第1个时间单位内,选择处理有5个积分的任务。1-3时无任务处理。

示例2

输入:4

           3

           1 2

           1 3

           1 4 

           3 5

输出:9

说明:第1个时间单位内,处理任务3,获得4个积分

           第2个时间单位内,处理任务4,获得5个积分

           第3个时间单位内,无任务可处理

           共获得9个积分

解题思路:

核心在于,我们需要保证最有完成的所有任务中,其中截至日期是1-x的任务数目不大于x个。所以我们遍历日期来做到这一点,使用小根堆来保证每次丢掉最小值。

Java解法:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
 
public class Main
 {
  public static void main(String[] args)
{
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  int t = sc.nextInt();
 
  List[] list = new List[t + 1];
  for (int i = 0; i < (t + 1); i++) {
    list[i] = new ArrayList<>();
  }
  for (int i = 0; i < n; i++) {
    int endTime = sc.nextInt();
    int value = sc.nextInt();
    list[Math.min(endTime,t)].add(value);
  }
  int ans = 0;
 
  List<Integer> waitList = new ArrayList<>();
  for (int i = t; i >0 ; i--) {
    waitList.addAll(list[i]);
    if (!waitList.isEmpty()) {
      waitList.sort(Comparator.com

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

华为OD机试题库2024年 文章被收录于专栏

2024年OD统一考试(D卷),最新最完整题库。 收录130+道真题,提供解题思路,Java/Python/C++三种答案源码。

全部评论

相关推荐

6 5 评论
分享
牛客网
牛客企业服务