洛谷P1280 尼克的任务 题解 动态规划/最短路
- 作者:zifeiy
- 标签:动态规划、最短路
题目链接:https://www.luogu.org/problem/P1280
题目大意:
有k个任务分布在第1至n这n个时间点,第i个任务的于第 \(P_i\) 分钟开始,持续时间为 \(T_i\) 分钟,则该任务将在第 \(P_i+T_i-1\) 分钟结束。
如果时刻i你是空闲的,而此时有至少一个任务是在时刻i开始的,那么你必须要在其中选择一个任务来做;
如果时刻i你是空闲的,而没有任何一个任务是在时刻i开始的,那么你在时刻i就可以是空闲的。
求你最多有多少个时刻是空闲的。
动态规划解法
我们令 \(f[i]\) 表示从时刻i开始到时刻n结束的这段时间范围内的最大空闲时刻数量。
那么我们就可以从n到1遍历时刻i,对于时刻i:
- 如果没有任务是在时刻i开始的,那么 \(f[i] = f[i+1] + 1\) ;
- 否则 \(f[i] = \max(f[ i + T_j ])\) ,其中,\(T_j\) 对应所有 \(P_j == i\) 。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int n, k, p, t, f[maxn];
vector<int> g[maxn];
int main() {
cin >> n >> k;
while (k --) {
cin >> p >> t;
g[p].push_back(t);
}
for (int i = n; i >= 0; i --) {
int sz = g[i].size();
if (sz == 0) f[i] = f[i+1] + 1;
else {
for (int j = 0; j < sz; j ++)
f[i] = max(f[i], f[ i + g[i][j] ]);
}
}
cout << f[1] << endl;
return 0;
}
最短路解法
这个思路来自 tong_xz大佬的博客
将时间点作为图中的点。
从第P分钟开始,持续时间为T分钟的任务视为从P点到P+T点连一条权为T的边。(边的起点是任务的起始时间,终点是任务结束时间的下一分钟)
如果一个点到最后也没有出度,则向后一个点连边权为0的边(没活干,这一分钟他可以摸鱼。。。)
跑最短路就得到他至少要干多长时间,答案就是(n-最短路结果)
如果将边权作为休息时间的话用最长路也能做。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int in[maxn], out[maxn], n, k, p, t, dis[maxn];
bool vis[maxn];
vector< pair<int, int> > g[maxn];
queue<int> que;
void spfa() {
memset(dis, -1, sizeof(int) * (n+2));
dis[1] = 0;
que.push(1);
while (!que.empty()) {
int u = que.front();
que.pop();
vis[u] = false;
int sz = g[u].size();
for (int i = 0; i < sz; i ++) {
int v = g[u][i].first, w = g[u][i].second;
if (dis[v] == -1 || dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if (!vis[v]) {
vis[v] = true;
que.push(v);
}
}
}
}
}
int main() {
cin >> n >> k;
while (k --) {
cin >> p >> t;
out[p] ++;
in[p+t] ++;
g[p].push_back(make_pair(p+t, t));
}
for (int i = 1; i <= n; i ++) {
if (!out[i]) g[i].push_back(make_pair(i+1, 0));
}
spfa();
cout << n - dis[n+1] << endl;
return 0;
}
洛谷P1280 尼克的任务 题解 动态规划/最短路的更多相关文章
- 洛谷 P1280 尼克的任务题解
题目链接:https://www.luogu.org/problem/P1280 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每 ...
- 洛谷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 ...
- 洛谷P1028 数的计算 题解 动态规划入门题
题目链接:https://www.luogu.com.cn/problem/P1028 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 \(n\) ): 先输入一个自然数 \(n(n \ ...
- 洛谷 [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 ...
随机推荐
- 使用SQLyog将Mysql中的表导出为Excel
有时会有这样的需求:将MYSQL数据库中的某个表格导出,存为Excel文件.下面介绍步骤: 1.打开SQLyog,选中要导出的表 2.右键--备份/导出--导出表数据作为... 3.如图选择 Exce ...
- Jmeter压测报错:Non HTTP response code: java.net.ConnectExceptionexception的解决办法
前一段时间进行jmeter压测时,一直报错,查看了下日志才发现报了一堆Non HTTP response code: java.net.ConnectExceptionexception,直接jmet ...
- Ubuntu无法连接无线网
shell里输入: su ifconfig wlan0 up 不行的话 rfkill block all rfkill unblock all ifconfig wlan0 up
- Haskell 学习
truncate pi -- 表示截断, 此处结果为 3 haskell中的touple是可变的,而python中是不可变的 lines函数: lines :: String -> [Strin ...
- 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子
题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...
- 构造器 构造方法 constructor
构造器的作用: 1.创建对象. 设计类时,若不显示的声明类的构造器的话,程序会默认提供一个空参的构造器. 一旦显示的定义了构造器,就不再默认提供. 声明类的构造器:权限修饰符 与类同名(形参){} 类 ...
- uva 10453 【回文串区间dp】
Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...
- spring调试
spring-beans DefaultListableBeanFactory preInstantiateSingletons:650 RequestMappingHandlerMapping Ab ...
- java.lang.StackOverflowError 解决办法
java.lang.StackOverflowError com.sxt.servlet.servlet1.LoginServlet.doGet(LoginServlet.java:15) com.s ...
- HZOJ 连连看
考场几乎想到了正解,然而我也不知道当时在想啥,在没有证伪的情况下只是觉得无法实现就否了…… 最后打的好象是达哥说的O(4*15*n*m),复杂度不是很会证反正T成了暴力…… 题解: 对于测试点8,9, ...