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;
}

原文地址:https://www.cnblogs.com/lixiao189/p/9888612.html

时间: 2024-10-11 16:42:43

Luogu P1280 尼克的任务题解的相关文章

luogu P1280 尼克的任务 序列DP

我们发现,我们从前往后DP有苦难,因为现在的选择存在后效性. 如果我们从后向前DP,f[i]表示从i时刻到下班的最小工作时间,从后向前转移,则不存在后效性问题. 1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4 vector <int> vec[10010]; 5 int f[10010]; 6 int n,k; 7 int main() 8 { 9 scanf("%d%d&quo

尼克的任务题解

题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

洛谷 P1280 尼克的任务 ( 线性DP )

题意 :  尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

P1280 尼克的任务(DP)

题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

P1280 尼克的任务

题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完戍,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

洛谷 P1280 尼克的任务

题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完戍,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

洛谷P1280 尼克的任务

题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完戍,尼克可以任选其中的 一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完 成.如果某任务于第P分钟开始,持续时间为T分钟,则该任

【luogu P1455 搭配购买】 题解

题目链接:https://www.luogu.org/problemnew/show/P1455 一句话题目做法:并查集合并+01背包 启示:要每次再find一遍.路径压缩会快.因为合并的时候如果是1连3,3连2,4连2,最后也不能保证一步就能连到fa上去. 结果会是fa[2] = fa[3] = fa[4] = 2. fa[1] = 3. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm>

【luogu P2455 [SDOI2006]线性方程组】 题解

题目链接:https://www.luogu.org/problemnew/show/P2455 嗯...在消元过程中不要直接拿矩阵元素自己消,会把自己消成0. 1 #include <algorithm> 2 #include <cstdio> 3 #include <cmath> 4 #include <iostream> 5 using namespace std; 6 const int maxn = 200; 7 const double eps