洛谷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 ...
 
随机推荐
- 【指南】本地如何搭建IPv6环境测试你的APP
			
由于苹果最近更新IOS10之后他们的工作环境升级了,统一用IPV6网络,所以我们发出去的申请的APP不兼容IPV6的话,会通过不了审核! 所幸的是苹果会自动把你服务器要接的协议自动把iPV6转成IPV ...
 - Ajax系列之二:核心对象XMLHttpRquest
			
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhanghongjie0302/article/details/31432939 ...
 - UI标签库专题五:JEECG智能开发平台 Tabs(选项卡父标签)
			
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/28956223 tools string ...
 - Docker.[1].环境准备.
			
Docker.[1].环境准备. 环境描述: 在笔记本中安装了虚拟机,虚拟机中又安装了RedHat 7.x操作系统,然后在这个RedHat7.x的操作系统上,进行安装Docker. 虚拟机中的操作系统 ...
 - jquery的innerWidth 和 innerHeight的使用
			
innerWidth This method returns the width of the element, including left and right padding, in pixels ...
 - Codeforces 442B
			
题目链接 B. Andrey and Problem time limit per test 2 seconds memory limit per test 256 megabytes input s ...
 - 使用php封装APP接口
			
php封装APP接口 我们先来介绍Json的封装方法 json_encode函数传递中文的话,输出后是乱码的,针对这个问题我觉得有必要做一个解释: 其实json_encode对中文那不是乱码,只是js ...
 - Asterisk 代码架构概述
			
from:http://blog.csdn.net/yetyongjin/article/details/7594447 近日分析Asterisk 1.8源码.Asterisk trunk上有这篇架构 ...
 - 网络流24题 负载平衡(DCOJ8013)
			
题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件 ...
 - WinMail邮件服务器(客户端)环境搭建与配置
			
WinMail邮件服务器(客户端)环境搭建与配置 一.在搭建WinMail邮件服务器(客户端)之前必备 (1).在虚拟机上安装两个干净无毒的操作系统 ...