洛谷 P1280 尼克的任务题解
题目链接: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。
输出格式
输出文件仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。
输入输出样例
- 15 6
- 1 2
- 1 6
- 4 11
- 8 5
- 8 1
- 11 5
- 4
题解
这题一般的解法都是DP。其实是可以用DFS暴力过的。
先介绍一个TLE的代码。这个代码中我们没有对任务进行时间排序,而是将任务信息保存在vis数组中。vis[i][0]保存着开始时间为i的时候的任务数,而vis[i][1]……vis[i][n]保存着开始时间为i的各任务的持续时间。
- #include <iostream>
- #include <math.h>
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- const int MAXN = 1e4 + ;
- int n, t, start[MAXN], keep[MAXN], vis[MAXN][];
- int dfs(int st)
- {
- if(st >= t)
- {
- return ;
- }
- if(vis[st][] == )
- {
- st++;
- return dfs(st);
- }
- else
- {
- int mint = 0x3f3f3f;
- for(int i = ; i <= vis[st][]; i++)
- {
- int w = dfs(st + vis[st][i]);
- if(mint > w + vis[st][i])
- {
- mint = w + vis[st][i];
- }
- }
- return mint;
- }
- }
- int main()
- {
- cin >> t >> n;
- for(int i = ; i <= n; i++)
- {
- cin >> start[i] >> keep[i];
- vis[start[i]][]++;
- vis[start[i]][vis[start[i]][]] = keep[i];
- }
- cout << t - dfs() << endl;
- return ;
- }
要避免TLE,可以将每个子节点深搜的结果保存在data中,如果已经搜素过该子节点,就不再搜素了,这样就可以AC了。
- #include <iostream>
- #include <math.h>
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- const int MAXN = 1e4 + ;
- int n, t, start, keep, vis[MAXN][];
- int data[MAXN];
- int dfs(int st)
- {
- if(st > t)
- {
- return ;
- }
- if(data[st])
- {
- return data[st];
- }
- if(vis[st][] == )
- {
- st++;
- return dfs(st);
- }
- else
- {
- int mint = 0x3f3f3f;
- for(int i = ; i <= vis[st][]; i++)
- {
- int w = dfs(st + vis[st][i]);
- if(mint > w + vis[st][i])
- {
- mint = w + vis[st][i];
- }
- }
- data[st] = mint;
- return mint;
- }
- }
- int main()
- {
- cin >> t >> n;
- for(int i = ; i <= n; i++)
- {
- cin >> start >> keep;
- vis[start][]++;
- vis[start][vis[start][]] = keep;
- }
- cout << t - dfs() << endl;
- return ;
- }
洛谷 P1280 尼克的任务题解的更多相关文章
- 洛谷P1280 尼克的任务 题解 动态规划/最短路
作者:zifeiy 标签:动态规划.最短路 题目链接:https://www.luogu.org/problem/P1280 题目大意: 有k个任务分布在第1至n这n个时间点,第i个任务的于第 \(P ...
- 洛谷P1280 尼克的任务[DP]
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- 洛谷P1280 尼克的任务
这个DP气死我了.....写的时候脑子比较迟钝于是爆0了好几次,最后还是我旁边的AKIOI巨佬告诉我解法才会做. 我一开始设计的状态是f[i]表示i时刻正在休息,从1到i的最长休息时间. 然后经历了各 ...
- 洛谷P1280 尼克的任务 [DP补完计划]
题目传送门 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从 ...
- 洛谷P1280 尼克的任务【线性dp】
题目:https://www.luogu.org/problemnew/show/P1280 题意: 给定k个任务的开始时间和持续时间要求在n时间内完成.问如何安排工作使得休息时间最多. 思路: 用d ...
- 洛谷 [P1280] 尼克的任务
DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如 ...
- 洛谷 P1280 尼克的任务 (线性DP)
题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...
- Java实现 洛谷 P1280 尼克的任务
import java.util.Scanner; public class Main { public static class edg{ private int to; private int n ...
- 洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)
这道题我一直按照往常的思路想 f[i]为前i个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...
随机推荐
- [LeetCode] 853. Car Fleet 车队
N cars are going to the same destination along a one lane road. The destination is target miles awa ...
- servlet 标红的错误笔记
错误原因,没有添加来自Tomcat服务器的jar包依赖. 解决方法
- PHP 批量删除的实现
布局效果 布局代码 <button type="button" class="btn btn-sm btn-danger btn-erbi-danger" ...
- python标准库之glob介绍
python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...
- docker(一): 安装
开始 docker是一个可以帮助开发者使用容器(containers)开发.部署和运行应用程序的平台.llinux下使用容器部署系统称为containerization. container 是映像( ...
- U盘改造计划之PE、kali、U盘三合一
最强U盘攻略之一 前一段时间朋友买电脑问了我一些问题,我突然发现U盘怎么这么便宜,128G金士顿,140?!!!我16年买的可是240啊.买贵一百块,我好方啊.但是我的U盘,我是不会屈服做一个普通的U ...
- 【scratch3.0教程】2.2 魔力手环
编程前的准备 在设计一个作品之前,必须先策划一个脚本,然后再根据脚本,收集或制作素材(图案,声音等)接着就可以启动Scratch,汇入角色,舞台,利用搭程序积木的方式编辑程序,制作出符合脚本的动画或游 ...
- Luogu4827 Crash的文明世界 组合、树形DP
传送门 又是喜闻乐见的\(k\)次幂求和题目 那么\(S(x) = \sum\limits_{i=1}^n dist(i,x)^k = \sum\limits_{i=1}^n \sum\limits_ ...
- 创建包含CRUD操作的Web API接口3:实现Post方法
本节是前面两节的延续,前面我们为Web API创建了必要的基础设施,并实现了Get方法.在这里,我们将在Web API中实现POST方法. 在RESTful架构中,使用HTTP POST请求用来在数据 ...
- JSON C# Class Generator
http://www.xamasoft.com/json-class-generator/ JsonHelper.cs using System; using System.Collections.G ...