题意:给定工作时间N,和K个任务的起始时间P和持续时间T,从第1分钟开始工作,某一时刻若有多个工作则任选一个工作,若只有一个工作则必须要选那个来做,求出能够得到的最多的空闲时间
思路:因为时间只能是递增的,所以可以考虑按时间倒序来做,若某一时刻没有任务,则dp[i]=dp[i+1]+1,若有任务,则dp[i]=max(dp[i+Ti]),Ti为起始时刻为i的所有持续时间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5+10;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
int n, k, dp[maxn];
vector<int> p[maxn];
int main()
{
cin >> n >> k;
for (int i = 1; i <= k; i++) {
int P, T;
cin >> P >> T;
p[P].push_back(T);
}
for (int i = n; i >= 1; i--) {
if (p[i].size() == 0)
dp[i] = dp[i+1] + 1;
else
for (int j = 0; j < p[i].size(); j++) {
if (dp[i+p[i][j]] > dp[i])
dp[i] = dp[i+p[i][j]];
}
}
cout << dp[1] << "\n";
return 0;
}
本文介绍了一种基于动态规划的工作调度算法,通过倒序遍历任务并计算最优解,以最大化空闲时间。适用于有固定工作时间和多个任务的情况。
123

被折叠的 条评论
为什么被折叠?



