题意:给定工作时间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;
}