题目链接:https://www.luogu.org/problem/P1280

题目描述

尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。

尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束。当尼克到达单位后他就开始干活。如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。如果某任务于第P分钟开始,持续时间为T分钟,则该任务将在第P+T-1分钟结束。

写一个程序计算尼克应该如何选取任务,才能获得最大的空暇时间。

输入格式

输入数据第一行含两个用空格隔开的整数N和K(1≤N≤10000,1≤K≤10000),N表示尼克的工作时间,单位为分钟,K表示任务总数。

接下来共有K行,每一行有两个用空格隔开的整数P和T,表示该任务从第P分钟开始,持续时间为T分钟,其中1≤P≤N,1≤P+T-1≤N。

输出格式

输出文件仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。

输入输出样例

输入 #1复制

  1. 15 6
  2. 1 2
  3. 1 6
  4. 4 11
  5. 8 5
  6. 8 1
  7. 11 5
输出 #1复制

  1. 4

题解

这题一般的解法都是DP。其实是可以用DFS暴力过的。

先介绍一个TLE的代码。这个代码中我们没有对任务进行时间排序,而是将任务信息保存在vis数组中。vis[i][0]保存着开始时间为i的时候的任务数,而vis[i][1]……vis[i][n]保存着开始时间为i的各任务的持续时间。

  1. #include <iostream>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <algorithm>
  5. #include <string.h>
  6.  
  7. using namespace std;
  8.  
  9. const int MAXN = 1e4 + ;
  10. int n, t, start[MAXN], keep[MAXN], vis[MAXN][];
  11.  
  12. int dfs(int st)
  13. {
  14. if(st >= t)
  15. {
  16. return ;
  17. }
  18. if(vis[st][] == )
  19. {
  20. st++;
  21. return dfs(st);
  22. }
  23. else
  24. {
  25. int mint = 0x3f3f3f;
  26. for(int i = ; i <= vis[st][]; i++)
  27. {
  28. int w = dfs(st + vis[st][i]);
  29. if(mint > w + vis[st][i])
  30. {
  31. mint = w + vis[st][i];
  32. }
  33. }
  34. return mint;
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. cin >> t >> n;
  41. for(int i = ; i <= n; i++)
  42. {
  43. cin >> start[i] >> keep[i];
  44. vis[start[i]][]++;
  45. vis[start[i]][vis[start[i]][]] = keep[i];
  46. }
  47. cout << t - dfs() << endl;
  48. return ;
  49. }

要避免TLE,可以将每个子节点深搜的结果保存在data中,如果已经搜素过该子节点,就不再搜素了,这样就可以AC了。

  1. #include <iostream>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <algorithm>
  5. #include <string.h>
  6.  
  7. using namespace std;
  8.  
  9. const int MAXN = 1e4 + ;
  10. int n, t, start, keep, vis[MAXN][];
  11. int data[MAXN];
  12.  
  13. int dfs(int st)
  14. {
  15. if(st > t)
  16. {
  17. return ;
  18. }
  19. if(data[st])
  20. {
  21. return data[st];
  22. }
  23. if(vis[st][] == )
  24. {
  25. st++;
  26. return dfs(st);
  27. }
  28. else
  29. {
  30. int mint = 0x3f3f3f;
  31. for(int i = ; i <= vis[st][]; i++)
  32. {
  33. int w = dfs(st + vis[st][i]);
  34. if(mint > w + vis[st][i])
  35. {
  36. mint = w + vis[st][i];
  37. }
  38. }
  39. data[st] = mint;
  40. return mint;
  41. }
  42. }
  43.  
  44. int main()
  45. {
  46. cin >> t >> n;
  47. for(int i = ; i <= n; i++)
  48. {
  49. cin >> start >> keep;
  50. vis[start][]++;
  51. vis[start][vis[start][]] = keep;
  52. }
  53. cout << t - dfs() << endl;
  54. return ;
  55. }

洛谷 P1280 尼克的任务题解的更多相关文章

  1. 洛谷P1280 尼克的任务 题解 动态规划/最短路

    作者:zifeiy 标签:动态规划.最短路 题目链接:https://www.luogu.org/problem/P1280 题目大意: 有k个任务分布在第1至n这n个时间点,第i个任务的于第 \(P ...

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

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

  3. 洛谷P1280 尼克的任务

    这个DP气死我了.....写的时候脑子比较迟钝于是爆0了好几次,最后还是我旁边的AKIOI巨佬告诉我解法才会做. 我一开始设计的状态是f[i]表示i时刻正在休息,从1到i的最长休息时间. 然后经历了各 ...

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

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

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

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

  6. 洛谷 [P1280] 尼克的任务

    DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如 ...

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

    题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...

  8. Java实现 洛谷 P1280 尼克的任务

    import java.util.Scanner; public class Main { public static class edg{ private int to; private int n ...

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

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

随机推荐

  1. [LeetCode] 853. Car Fleet 车队

    N cars are going to the same destination along a one lane road.  The destination is target miles awa ...

  2. servlet 标红的错误笔记

    错误原因,没有添加来自Tomcat服务器的jar包依赖. 解决方法

  3. PHP 批量删除的实现

    布局效果 布局代码 <button type="button" class="btn btn-sm btn-danger btn-erbi-danger" ...

  4. python标准库之glob介绍

    python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...

  5. docker(一): 安装

    开始 docker是一个可以帮助开发者使用容器(containers)开发.部署和运行应用程序的平台.llinux下使用容器部署系统称为containerization. container 是映像( ...

  6. U盘改造计划之PE、kali、U盘三合一

    最强U盘攻略之一 前一段时间朋友买电脑问了我一些问题,我突然发现U盘怎么这么便宜,128G金士顿,140?!!!我16年买的可是240啊.买贵一百块,我好方啊.但是我的U盘,我是不会屈服做一个普通的U ...

  7. 【scratch3.0教程】2.2 魔力手环

    编程前的准备 在设计一个作品之前,必须先策划一个脚本,然后再根据脚本,收集或制作素材(图案,声音等)接着就可以启动Scratch,汇入角色,舞台,利用搭程序积木的方式编辑程序,制作出符合脚本的动画或游 ...

  8. Luogu4827 Crash的文明世界 组合、树形DP

    传送门 又是喜闻乐见的\(k\)次幂求和题目 那么\(S(x) = \sum\limits_{i=1}^n dist(i,x)^k = \sum\limits_{i=1}^n \sum\limits_ ...

  9. 创建包含CRUD操作的Web API接口3:实现Post方法

    本节是前面两节的延续,前面我们为Web API创建了必要的基础设施,并实现了Get方法.在这里,我们将在Web API中实现POST方法. 在RESTful架构中,使用HTTP POST请求用来在数据 ...

  10. JSON C# Class Generator

    http://www.xamasoft.com/json-class-generator/ JsonHelper.cs using System; using System.Collections.G ...