题目描述:
现有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个积分
C++源码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int maxPoints(int T, vector<pair<int, int>>& tasks) {
vector<int> dp(T + 1, 0); // 初始化dp数组,大小为T+1,初始值为0
// 按照任务的最晚处理时间SLA升序排序
sort(tasks.begin(), tasks.end());
int tempT = 0;
int score = 0;
vector<int> tempArr(tasks.size());
for (int j = 0; j < tasks.size(); j++)
{
tempT++;
for (int i = 0; i < tasks.size(); i++)
{
if (tempT > T) { // 超过给定时间就直接退出
break;
}
else {
if (tempT == tasks[i].first) {
tempArr[i] = tasks[i].second;
}
}
}
// 统计一个时间单位内,最大的积分数
int maxScore = *max_element(tempArr.begin(), tempArr.end());
score = score + maxScore; // 统计得分
for (int k = 0; k < tempArr.size(); k++)
{
tempArr[k] = 0;
}
}
return score; // 返回dp数组的最后一个元素,即在T时间单位内可获得的最大积分
}
int main() {
int N, T;
cin >> N >> T;
vector<pair<int, int>> tasks(N); // 使用pair存储每个任务的SLA和积分值
for (int i = 0; i < N; ++i) {
cin >> tasks[i].first >> tasks[i].second; // 分别存储SLA和积分值
}
int result = maxPoints(T, tasks);
cout << result << endl;
system("pause");
return 0;
}