尼克的任务(P1280)
题目链接:尼克的任务
这道题,有点难度,也不是太难,因为我都做出来了。
好,下面分析一下:
这道题,显然的动规,我们这样设计状态。
我们设d[i]为从第i分钟初开始到结束有多少空闲时间。
那么我们的转移方程也出来了:
如果第i分钟没有开始的任务,那么
d[i]=d[i+1]+1;
这很好理解,因为不需要做任务,那么空闲时间就是前一种状态的时间加上新增的1分钟。
如果有第i分钟开始的任务,那么:
d[i]=max{d[i+t[j]]},j为任务的标号
这应该好理解,因为如果有任务,那么尼克是需要做任务的,所以一定要选择一个任务来做。那么做任务的这段时间肯定没有空闲时间,所以直接跳到任务完成的时间状态。
下面给代码。
给代码之前,讲一下,我的这个代码是有前提的,就是任务的输入按时间是有序的,题目似乎没讲,但提交是能AC的。所以,如果真的考试,是需要先排一下序,然后就行了。这里就不加排序代码了。
#include<bits/stdc++.h>
using namespace std;
int n,k;
int main(){
scanf("%d%d",&n,&k);
int begin[k],t[k],vis[n+1];//vis用来存储这个时间点有没有任务
memset(vis,0,sizeof(vis));
for(int i=0;i<k;i++){
scanf("%d%d",&begin[i],&t[i]);
vis[begin[i]]=1; //1
}
int tail=k-1; //2
int d[n+2];
memset(d,-1,sizeof(d));
d[n+1]=0; //3
for(int i=n;i>=1;i--){
if(vis[i]==1){ //4
while(begin[tail]==i){ //7
d[i]=max(d[i],d[i+t[tail--]]); //5
}
}else{
d[i]=d[i+1]+1; //6
}
}
printf("%d",d[1]);
return 0;
}
今天讲7点(还是挺多的哈):
1处:读入开始时间,把对应时间点标为有任务。
2处:这是任务的序号,我们这里默认是有序的,所以可以用一个tail去处理任务序号。
3处:边界。
4处:如果有任务
5处:注意tail–,这里因为有序,所以序号后面的任务,一定已经执行过,所以不断推进就行。
6处:如果没任务,那么就直接加一。
7处:如果这个任务是这个时间开始的,那么就执行,注意我们加了一个循环,因为一个时间点有多个任务,所以我们需要不断执行。
尼克的任务(P1280)的更多相关文章
- 洛谷 P1280 尼克的任务题解
题目链接:https://www.luogu.org/problem/P1280 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每 ...
- 洛谷P1280 尼克的任务[DP]
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- P1280 尼克的任务
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- P1280 尼克的任务 线性DP
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- 洛谷P1280 尼克的任务 [DP补完计划]
题目传送门 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从 ...
- 洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)
这道题我一直按照往常的思路想 f[i]为前i个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...
- P1280 尼克的任务[区间覆盖dp]
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- 洛谷P1280 尼克的任务【线性dp】
题目:https://www.luogu.org/problemnew/show/P1280 题意: 给定k个任务的开始时间和持续时间要求在n时间内完成.问如何安排工作使得休息时间最多. 思路: 用d ...
- P1280 尼克的任务 /// DP(选择性地)
题目大意: https://www.luogu.org/problemnew/show/P1280 题解 手推一遍思路更清晰 #include <bits/stdc++.h> using ...
随机推荐
- rancher 2 webhook 格式
{ "version":"4", "groupKey":<string>, "status":"& ...
- leetcode输入输出加速
C++兼容C的输入输出,即cin与scanf混用文件指针不会出错,cout亦同,导致cin有额外开销. 可以用std::ios::sync_with_stdio(false);手动关闭. cin.ti ...
- 【Linux 进程】孤儿进程、僵尸进程和守护进程
1.孤儿进程: 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作.孤儿进程是 ...
- 【Linux 进程】exec族函数详解
exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **e ...
- Union and Intersection of two sorted lists 并集和交集
跟面试官确认是arrayList还是singly-linked list /* Union 并集:两个升序的list a, b, 返回其并集(升序排序)*/ public class UnionTw ...
- day 23 网络编程
C/S架构 Client与Server B/S架构 Browser与Server windows上查看端口占用情况 netstat -a OSI七层模型: 其他略...
- 34-ssm 最简洁的模板
见 csdn :https://download.csdn.net/download/qq_39451578/10931448
- 举个通俗易懂的例子告诉你IAAS,SAAS,PAAS的区别
作者:何足道链接:https://www.zhihu.com/question/21641778/answer/62523535来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- [z]一个SQL语句分清楚RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
转自:http://blog.csdn.net/s630730701/article/details/51902762 在SCOTT用户下,执行下面SQL; SELECT s.deptno,s.ena ...
- Windows服务安装、卸载、启动和关闭的管理器
最近在重构公司的系统,把一些需要独立执行.并不需要人为关注的组件转换为Windows服务,Windows服务在使用的过程中有很多好处,相信这一点,就不用我多说了.但是每次都要建立Windows服务项目 ...