题目链接:尼克的任务

这道题,有点难度,也不是太难,因为我都做出来了。

好,下面分析一下:

这道题,显然的动规,我们这样设计状态。

我们设d[i]为从第i分钟初开始到结束有多少空闲时间。

那么我们的转移方程也出来了:

如果第i分钟没有开始的任务,那么

d[i]=d[i+1]+1;

这很好理解,因为不需要做任务,那么空闲时间就是前一种状态的时间加上新增的1分钟。

如果有第i分钟开始的任务,那么:

d[i]=max{d[i+t[j]]},j为任务的标号

这应该好理解,因为如果有任务,那么尼克是需要做任务的,所以一定要选择一个任务来做。那么做任务的这段时间肯定没有空闲时间,所以直接跳到任务完成的时间状态。

下面给代码。

给代码之前,讲一下,我的这个代码是有前提的,就是任务的输入按时间是有序的,题目似乎没讲,但提交是能AC的。所以,如果真的考试,是需要先排一下序,然后就行了。这里就不加排序代码了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,k;
  4. int main(){
  5. scanf("%d%d",&n,&k);
  6. int begin[k],t[k],vis[n+1];//vis用来存储这个时间点有没有任务
  7. memset(vis,0,sizeof(vis));
  8. for(int i=0;i<k;i++){
  9. scanf("%d%d",&begin[i],&t[i]);
  10. vis[begin[i]]=1; //1
  11. }
  12. int tail=k-1; //2
  13. int d[n+2];
  14. memset(d,-1,sizeof(d));
  15. d[n+1]=0; //3
  16. for(int i=n;i>=1;i--){
  17. if(vis[i]==1){ //4
  18. while(begin[tail]==i){ //7
  19. d[i]=max(d[i],d[i+t[tail--]]); //5
  20. }
  21. }else{
  22. d[i]=d[i+1]+1; //6
  23. }
  24. }
  25. printf("%d",d[1]);
  26. return 0;
  27. }

今天讲7点(还是挺多的哈):

1处:读入开始时间,把对应时间点标为有任务。

2处:这是任务的序号,我们这里默认是有序的,所以可以用一个tail去处理任务序号。

3处:边界。

4处:如果有任务

5处:注意tail–,这里因为有序,所以序号后面的任务,一定已经执行过,所以不断推进就行。

6处:如果没任务,那么就直接加一。

7处:如果这个任务是这个时间开始的,那么就执行,注意我们加了一个循环,因为一个时间点有多个任务,所以我们需要不断执行。

尼克的任务(P1280)的更多相关文章

  1. 洛谷 P1280 尼克的任务题解

    题目链接:https://www.luogu.org/problem/P1280 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每 ...

  2. 洛谷P1280 尼克的任务[DP]

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  3. P1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  4. P1280 尼克的任务 线性DP

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  5. 洛谷P1280 尼克的任务 [DP补完计划]

    题目传送门 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从 ...

  6. 洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)

    这道题我一直按照往常的思路想 f[i]为前i个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...

  7. P1280 尼克的任务[区间覆盖dp]

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  8. 洛谷P1280 尼克的任务【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1280 题意: 给定k个任务的开始时间和持续时间要求在n时间内完成.问如何安排工作使得休息时间最多. 思路: 用d ...

  9. P1280 尼克的任务 /// DP(选择性地)

    题目大意: https://www.luogu.org/problemnew/show/P1280 题解 手推一遍思路更清晰 #include <bits/stdc++.h> using ...

随机推荐

  1. 一些网站的meta标签的作用

    转载:https://www.cnblogs.com/Lily-nercel/p/6693293.html <!DOCTYPE html> <html lang="en&q ...

  2. 如何解决make: Nothing to be done for `all' 的方法

    正常情况下,当文件没有更新且已经编译过时,再次make就会报这个错误,表示文件未更新,不需要编译. 如果异常情况没有检测到更新文件,或者想要强制重新编译,只需要make clean,再次编译即可.

  3. CentOS 查找某个软件安装路径

    1.通过rpm查看 查看软件是否安装.首先我们需要查看软件是否已经安装,或者说查看安装的软件包名称.如查找是否安装mysql 2.接着根据 rpm -ql 列出软件包安装的文件 3.综合上述以上的问题 ...

  4. Python os.getcwd()

    Python os.getcwd() 方法  Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...

  5. 项目的发布(nginx、uwsgi、django、virtualenv、supervisor)

    导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...

  6. C++ 中的RTTI机制详解

    前言 RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法.RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使 ...

  7. swift 8.0之后打开 手机设置

    if #available(iOS 8.0, *){ if let url = URL(string: UIApplication.openSettingsURLString), UIApplicat ...

  8. Centos和Redhat的区别与联系

    CentOS的简介 CentOS是Community ENTerprise Operating System的简称,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是Linux操作系统的一个发行 ...

  9. android显示通知栏Notification以及自定义Notification的View

    遇到的最大的问题是监听不到用户清除通知栏的广播.所以是不能监听到的. 自定义通知栏的View,然后service运行时更改notification的信息. /** * Show a notificat ...

  10. 梦殇 chapter six

    如行尸走肉般的坐在教室,看著书上密密麻麻的字,心却久久不能平静. 自己已经不再是当初那个懵懂,无知的小女孩了.仰望天空45度,让眼泪流回眼睛. 是该告别彷徨,告别懵懂的年纪了. 早些年许下的诺言,如今 ...