Luogu P1280.尼克的任务

news2024/12/24 21:36:55

Luogu P1280.尼克的任务


原题点这里

思路

方法一:动态规划


这是一道动态规划的题目。

步骤主要分 5 5 5 步:

  1. 状态的定义
  2. 转移式的推到
  3. 递推顺序的判定
  4. 边界的确定
  5. 结果的输出

下面,我们针对这道题,细细地讲解一下每一个步骤

一、状态的定义


这道题的状态最简单,又直白——就是 f i f_i fi 表示 i ∼ n i \sim n in的最大休息时间。
对于状态的定义大家可以多去试一试,不行了就换一种思路,做多了就会有思路,一般的定义所具备的都是至少有一个 f i f_i fi 代表是第 i i i 个。

二、转移式的推到


一般情况下,如果状态找对了,那么转移式便会呼之欲出了。

这道题比较难想,运用到分类讨论的思想!

情况1:

如果时间点 i i i 没有任务,那么 f i = f i + 1 + 1 f_i = f_{i + 1} + 1 fi=fi+1+1,即上一个时间段的最大休息时间加上时间点 i i i 的歇息时间。

情况2:

如果时间点 i i i 是某一个任务的开始点,那么 f i = f i + t a s k i , j f_i = f_{i + task_{i, j}} fi=fi+taski,j(其中 t a s k i , j task_{i, j} taski,j 表示某个任务从 i i i 时间点开始,持续时间为 j j j

综上所述:
f i = { f i + 1 + 1 max ⁡ ( f i + t a s k i , j ) f_i=\left\{\begin{matrix} & f_{i + 1} + 1\\ & \max(f_{i+task_{i,j}}) \end{matrix}\right. fi={fi+1+1max(fi+taski,j)

三、递推顺序的判定


这一部分就很简单了,对于这道题因为我们发现一定会要么相同,要么由后面的状态所转移。

为了保持无后效性,我们需采用由大到小的顺序枚举

四、边界的确定


这道题大家可以想一想, f n f_n fn的值是多少呢?根据定义,即 n ∼ n n \sim n nn的最大休息时间,休息时间就是 0 0 0。所以初始化数组就是0,故我们不需要确定边界!

五、结果的输出


根据我们的状态的定义,不难确定出答案就是 f 1 f_1 f1

代码


#include <iostream>
#include <vector>

using namespace std;

const int N = 1e4 + 10;

int n, k;
int p, t;
vector<int> task[N];
int f[N];

int main()
{
	cin >> n >> k;
	
	for (int i = 1; i <= k; i ++)
		cin >> p >> t, task[p].push_back(t);
		
	for (int i = n; i >= 1; i --)
		if (task[i].size())
			for (auto c : task[i])
				f[i] = max(f[i], f[i + c]);
		else
			f[i] = f[i + 1] + 1;
			
	cout << f[1] << endl;
}

方法二:最短路(Dijkstra)


对于每一个任务,可以连接一条 p p p p + t p+t p+t 边长为 t t t 的边,对于那些没有连接的点,我们就将他们与下一个时间点相连,边权为 0 0 0。之后,跑一遍最短路,就是我们要花费的最小时间。注意,最后返回的是 d i s t n + 1 dist_{n+1} distn+1,而不是 d i s t n dist_n distn。因为任务是从 p + t − 1 p+t-1 p+t1 结束,最后 p + t p+t p+t 可能会超出 n n n,所以输出 d i s t n + 1 dist_{n+1} distn+1

代码


#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

const int N = 2e4 + 10;
typedef pair<int, int> PII;

int n, k;
int p, t;
int h[N], e[N], ne[N], w[N], idx;
int dist[N], st[N];

void add(int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}

int Dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});
    dist[1] = 0;
    
    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();
        
        int u = t.second, dis = t.first;
        
        if (st[u]) continue;
        st[u] = 1;
        
        for (int i = h[u]; ~i; i = ne[i])
            if (dist[e[i]] > dis + w[i])
            {
                dist[e[i]] = dis + w[i];
                heap.push({dist[e[i]], e[i]});
            }
    }
    
    return dist[n + 1];
}

int main()
{
    memset(h, -1, sizeof h);
    
    cin >> n >> k;
    
    for (int i = 1; i <= k; i ++)
        cin >> p >> t, add(p, p + t, t);
        
    for (int i = 1; i <= n; i ++)
        if (h[i] == -1)
            add(i, i + 1, 0);
            
    cout << n - Dijkstra() << endl;
}

最后祝大家早日——
在这里插入图片描述

纵有狂风平地起,我欲乘风破万里!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL单表数据量达到多少时性能会严重下降的问题探讨!

不知从什么时候开始&#xff0c;有着MySQL单表数据量超过2000万性能急剧下降的说法。 在中国互联网技术圈流传着这么一个说法&#xff1a;MySQL 单表数据量大于 2000 万行&#xff0c;性能会明显下降。事实上&#xff0c;这个传闻据说最早起源于百度。具体情况大概是这样的&am…

PS 魔棒选区工具使用方法

我们现在PS中打开一个项目 然后 如下图 在工具左侧 选择魔棒工具 选择魔棒工具之后 我们的鼠标会变成像一个魔法棒一样的东西 我们拿着魔棒工具 在下图指向位置点一下 就可以看到 它在我们整个图上生成了一些选区 这个工具本身也带有一些色彩识别的功能 就相当于 你点的这…

【MySQL系列】MySQL库的学习及基本操作(增删查改)

「前言」文章内容大致是数据库的基本操作 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 哪里会有人喜欢孤独&#xff0c;不过是不喜欢失望罢了。 ——村上春树《挪威的森林》 目录 一、创建/查看数据库二、删除数据库三、…

Java8 lambda 表达式 forEach 如何提前终止?

首先&#xff0c;让我们看一下Java 8中如何使用forEach()方法。forEach()方法接受一个Consumer接口作为参数&#xff0c;该接口定义了一个accept()方法&#xff0c;该方法接受一个对象并对其执行一些操作。因此&#xff0c;我们可以通过Lambda表达式来实现Consumer接口。下面是…

Camtasia2023中文版电脑屏幕记录和课件制作工具

TechSmith Camtasia是一个非常容易使用的电脑屏幕记录和课件制作工具。Camtasia 2023软件集强大的录屏、视频编辑编辑、视频菜单制作、视频影院和视频播放功能于一体&#xff0c;可以轻松制作各种教学课件、微课堂等。Camtasia 2023支持一键录制和共享高质量截屏视频&#xff0…

Pytorch: 数据读取机制Dataloader与Dataset

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 数据读取机制Dataloader与DatasetDataLoader 与 Datasettorch.utils.data.DataLoader区分Epoch、Iteration、Batchs…

2022年真题 - 18 - 磁盘快照

磁盘快照 题目新增 15 G 的磁盘创建 LVM 卷挂载 LVM 卷写入文本创建快照挂载快照验证配置题目 StorageSrv - 磁盘快照 新增 15G 的磁盘,并将其做成 LVM 卷,VG 名称为 snapvg,LV名称为 snaplv 大小为 5G,挂载至 /snapdata 目录下;写入文本的文件数据至 /snapdata 目录下,…

2.5 DNS 应用 -- 2. DNS记录和消息格式

2.5 DNS 应用 -- 2. DNS记录和消息格式 DNS记录DNS协议与消息如何注册域名&#xff1f; DNS记录 资源记录(RR, resource records)TypeA Name: 主机域名Value: IP地址 TypeNS Name: 域(edu.cn)Value: 该域权威域名解析服务器的主机域名 TypeCNAME Name: 某一真实域名的别名 www.…

2.常见网页布局

2.1常见网页布局 第一种 第二种 第三种&#xff08;最常见的&#xff09; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

苹果自带的分享以及图片保存授权和应用跳转

// NSString *testToShare "分享的标题"; // NSURL *urlToShare [NSURL URLWithString:"http://www.baidu.com"]; // UIImage *imageToShare image; // NSArray *activityItems [te…

【算法】程序员必须掌握的算法?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 一&#xff1a;程序员为什么一定要学会算法 二&#xff1a;常见算法介绍 1、时间复杂度 2、空间复杂度 3. 必会内容&#xff1a; 4.使用场景 5. 算法学习网站&#xff1a; 三&…

《Linux基础命令讲解》学习笔记

Linux简单介绍 Linux不是一个具体的操作系统&#xff0c;而是一类操作系统的总称。 具体版本称为发行版&#xff1a; Red Hat:目前被IBM收购&#xff0c;收费版&#xff0c;目前全球最大的Linux供应商 CentOS: Red Hat推出的免费版 Ubuntu :界面比较友好 Linux系统目录结构…

vue3+element-plus实现日历组件农历显示且带列表数据

calendar.js https://gitee.com/mirrors/calendar-js.git 这个js可以去下载&#xff0c;里面涉及的有点多 要设置日历每周以周一开始&#xff0c;需要在main.js中加入这一行代码 import dayjs/locale/zh-cn; // 设置日历每周从周一开始<template><ELPlusLanguageC…

华秋约定您!7月11-13日慕尼黑上海电子展不见不散~

慕尼黑最新华秋展会攻略来啦 华秋携海量产品与方案 以及丰富的元器件产品线 即将亮相慕尼黑上海电子展 现场干货和福利不断 简直不要太精彩&#xff01; 敲黑板 划重点 华秋展位 时间&#xff1a;2023年7月11日-7月13日 地点&#xff1a;国际会展中心&#xff08;上海&…

IT-OT 安全融合是优化风险管理的关键

最新报告揭示了运营技术检测和响应方面的显着可见性差距。 全球网络安全运营商趋势科技宣布了一项新研究&#xff0c;显示企业安全运营中心 (SOC) 正在将其能力扩展到 OT 领域。 然而&#xff0c;重大的可见性和技能相关的挑战仍然造成障碍。 研究发现&#xff0c;一半的组织…

公共医疗数据库汇总:无需实验,高效论文撰写利器

一、引言 在医学研究领域&#xff0c;获取高质量的数据和文献资源是进行科学论文撰写的关键。随着信息技术的发展&#xff0c;以及公共医疗数据库的不断壮大和完善&#xff0c;研究人员可以轻松地获取大量的医学数据和文献信息&#xff0c;从而提高论文撰写的效率和质量。本文将…

基于Python的K-Means聚类算法的酒店客户价值分析(源码+数据+文档+CSV数据文件)

通过对传统的RFM客户价值研究模型进行分析&#xff0c;创新性的引入L&#xff08;信誉度&#xff09;指标到RFM模型中&#xff0c;形成RFML新型更适合酒店行业的客户价值研究模型。 一、技术介绍 &#xff08;1&#xff09;RFM 模型 RFM模型是提出的一种分析客户关系管理&…

C++旋转卡壳法求最小面积外接矩形

旋转卡壳基本概念介绍&#xff1a;(86条消息) 旋转卡壳详解_大学要有梦想的博客-CSDN博客 OpenCV里面有现成的计算最小面积外接矩形的方法&#xff0c;但是由于我装了好久也没装上opencv&#xff0c;最后还是决定自己实现。 求多边形最小面积外接矩形的基本思路是&#xff1a;…

loader 和 plugin

loader 是文件加载器&#xff0c;能够加载资源文件&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中plugin 赋予了 webpack 各种灵活的功能&#xff0c;例如打包优化、资源管理、环境变量注入等&#xff0c;目的是解决…

数据分析:一文带你了解PowerBI技术

目录 一、PowerBI简介 二、Power BI 的组成部分 三、Power BI 如何匹配角色 四、下载 Power BI Desktop 五、登录到 Power BI 服务 六、Power BI的优势 6.1 发展潜力巨大&#xff0c;前景广阔 6.2 可连接的数据来源多&#xff0c;数据量大 6.3 软件更新频率高 6.4 可为…