洛谷 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个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...
随机推荐
- WIN7 浏览器 收藏夹栏字体太小
在“窗口颜色和外观”-项目-“消息框”,把字体大小调大. "标题按钮" 大小 21.
- 【视频开发】CximageMat 、CximagelplImage 以及 lplImageMat的转换、像素位深度
1.传统的lplImage * -------> Mat格式 IplImage* img = cvLoadImage("greatwave.png", 1); Mat mtx ...
- 湖南省第6届程序大赛 Repairing a Road
Problem G Repairing a Road You live in a small town with R bidirectional roads connecting C crossing ...
- 影响MySQL的性能(一)磁盘的选择
一.磁盘的选择也是影响MySQL的性能的重大因素之一 1.使用传统的机器硬盘读取数据的过程 2.如何选择传统机器硬盘的因素 二.使用RAID增加传统机器硬盘的性能 1.什么是RAID技术 2.常见的R ...
- python使用matplotlib在一个图形中绘制多个子图以及一个子图中绘制多条动态折线问题
在讲解绘制多个子图之前先简单了解一下使用matplotlib绘制一个图,导入绘图所需库matplotlib并创建一个等间隔的列表x,将[0,2*pi]等分为50等份,绘制函数sin(x).当没有给定x ...
- 2019-10-11 ubuntu ssh远程免密登录配置及配置别名
在客户端能正常远程访问服务端的前提下. 客户端: 1)配置免密 执行 ssh-keygen 即可生成 SSH 钥匙,回车三次. 执行 ssh-copy-id user@remote,可以让远程服务器记 ...
- Mac上go的下载安装教程
mac上go的下载安装教程 官网https://golang.google.cn/dl/下载,安装 环境变量配置 参考https://www.jianshu.com/p/5c1873eaf3ca Ba ...
- int and Integer
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- 【转】用chrome滚动截屏
用开发者常用的网站chrome,打开需要截屏的网页 使用快捷键组合:Alt + Command + I (Mac) || Ctrl + Shift + I (Windows) 使用快捷键组合来打开命令 ...
- Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...