Luogu P1280 尼克的任务题解
Posted lixiao189
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1280 尼克的任务题解相关的知识,希望对你有一定的参考价值。
思路
首先我们需要知道主角可以休息的最多的时间,那么我们可以设(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;
}
以上是关于Luogu P1280 尼克的任务题解的主要内容,如果未能解决你的问题,请参考以下文章