[luoguP1280] 尼克的任务(DP)

传送门

原本想着 f[i] 表示前 i 个任务的最优答案,但是不好转移

看了题解后,发现是 f[i] 表示前 i 分钟的最优解,看来还是不能死脑筋,思维得活跃,一个思路行不通就换一个思路。

把 f 数组置为 -INF,f[0] = 0

如果当前时间不是任务开始的时间,f[i] = max(f[i], f[i - 1] + 1)

如果当前时间是任务开始时间,f[i + b[j] - 1] = max(f[i + b[j] - 1], f[i - 1])

——代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #define N 100001
 5 #define max(x, y) ((x) > (y) ? (x) : (y))
 6
 7 int n, m;
 8 int a[N], b[N], f[N];
 9
10 inline int read()
11 {
12     int x = 0, f = 1;
13     char ch = getchar();
14     for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
15     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
16     return x * f;
17 }
18
19 int main()
20 {
21     int i, j;
22     n = read();
23     m = read();
24     memset(f, -127 / 3, sizeof(f));
25     f[0] = 0;
26     for(i = 1; i <= m; i++) a[i] = read(), b[i] = read();
27     j = 1;
28     for(i = 1; i <= n; i++)
29     {
30         if(a[j] ^ i) f[i] = max(f[i], f[i - 1] + 1);
31         else while(a[j] == i)
32         {
33             f[i + b[j] - 1] = max(f[i + b[j] - 1], f[i - 1]);
34             j++;
35         }
36     }
37     printf("%d\n", f[n]);
38     return 0;
39 }

时间: 2024-10-27 04:22:57

[luoguP1280] 尼克的任务(DP)的相关文章

P1280 尼克的任务 dp

思路: 倒着DP  f[i]表示i时刻的空闲时间最大值 在当前时间没有任务开始 f[i]=f[i+1]+1;    上一分钟最大空闲时间+1 在当前时间有任务开始  f[i]=max(f[i],f[i+a[sum])  //  i+a[sum]表示做完任务后的最大空闲时间  因为做任务的时候是忙着的 所以这样转移 因为 最后做的任务 不会影响前面 所以dp满足无后效性 #include<bits/stdc++.h> using namespace std; const int maxn=100

「LuoguP1280」尼克的任务

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

TYVJ P1034 尼克的任务 Label:倒推dp

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

Tyvj P1034 尼克的任务 (DP)

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

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

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

P1280 尼克的任务(DP)

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

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

洛谷OJ 1280 尼克的任务 线性DP

https://www.luogu.org/problem/show?pid=1280 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef pair<int,int> ii; 5 const int N=2e5+20; 6 const ll inf=2e15; 7 //ìaòa:??3?k,k<=1e4??1¤×÷????[s,t],?3ê±?ìóDè???&a

tyvj1034 尼克的任务

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