思路
首先我们需要知道主角可以休息的最多的时间,那么我们可以设\(dp[i]\)为第\(i\)分钟可以休息的最大时间那么我们可以发现假如第\(i\)分钟没有主角没有任何任务,那么主角就可以放心休息转移方程为\(dp[i] = dp[i + 1] + 1\)。如果主角在当前第\(i\)分钟里面有任务那么在\(i \sim i + t - 1\)这段时间里面就别想休息了(\(t\)为当前任务的时间)。所以我们可以得到转移方程为\(dp[i] = dp[i + t]\) 最后注意一下枚举的顺序就可以了。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e4 + 5 ;
int n, k;
int book[N];
int dp[N];
struct STR {
int ts; //任务开始的时间
int t; //任务持续的时间
} Str[N];
int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0';
ch = getchar();
}
return s * w;
}
void write(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int main(int argc, char const *argv[]) {
n = read(), k = read();
for (register int i = 1; i <= k; ++i) {
Str[i].ts = read(), Str[i].t = read();
book[Str[i].ts] = 1; //标记开始的时间
}
for (register int i = n; i >= 1; --i) { //枚举时间
if (!book[i]) {
dp[i] = dp[i + 1] + 1;
continue;
}
for (register int j = 1; j <= k; ++j) { //枚举任务
if (Str[j].ts == i)
dp[i] = max(dp[i], dp[i + Str[j].t]);
}
}
write(dp[1]);
return 0;
}
原文地址:https://www.cnblogs.com/lixiao189/p/9888612.html
时间: 2024-10-11 16:42:43