【题解】E. Sending a Sequence Over the Network(1741)

news2024/11/26 18:40:07

链接:https://codeforces.com/problemset/problem/1741/E

题目大意

给出一个数组,判断它是否是合法的,如果合法则输出YES,不合法则输出NO。
合法规则:一段序列中,这个序列的第一个或者最后一个的数值,是这段序列的长度-1,那么我们就说这个序列是合法的。
例如:[8,3,2]就是一个合法的序列,因为2,是[8,3]的长度。
例如:1 1 2 3 1 3 2 2 3是一个合法的序列,因为[1,2,3,1,2,3] with the following partition: [1]+[2,3,1]+[2,3]. The sequence b: [1,1,2,3,1,3,2,2,3].(就原题的解释)

思路

这一眼看上去就知道,应该是动态规划的题目,为什么,这是因为,我们知道,一个区间是不是合法,它取决于,它前面的区间是否合法。
那么很简单啦,我们使用一个lastFind保存我们所有找到的合法区间,比如里面有个4就是到4这里是合法的,对于整个序列来说。好,那没了。就这样我们就可以写出下面的这样代码。

代码(TLE)

// VsCode C++模板 | (●'◡'●)
#include <bits/stdc++.h>
 
#include <iostream>
using namespace std;
typedef long long LL;
#define N 2 * 100000 + 5
int t, n, b[N];
bool check(int xi, int xy) {  //[xi,xy] 检查是否符合条件
    if (xi == xy) return false;
    if (b[xi] == (xy - xi) || b[xy] == (xy - xi)) {
        return true;
    } else {
        return false;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin >> t;
    while (t--) {
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> b[i];
        }
        vector<int> lastFind{-1};//-1的话,是我们的默认开始值,这样第一个check就从0开始了,看下面的(-1)+1
        for (int i = 0; i < n; i++) {
            for (auto it = lastFind.begin(); it != lastFind.end(); it++) {
                if (check((*it) + 1, i)) {//如果前面合法,然后check也合法
                    lastFind.push_back(i);//那么到i这里肯定也合法
                    break;
                }
            }
        }
        bool ans = *(lastFind.end() - 1) == n - 1;//如果n-1是合法的,那就是Yes
        ans == true ? printf("YES\n") : printf("NO\n");
    }
    return 0;
}

所以小熊就洋洋洒洒地写出来了这些代码,很快啊,反手就Submit了。哎呦,不讲武德,居然是TLE了,这是为什么?仔细思考一下。

改进思路

原来是,这个程序最坏复杂度是 O ( N 2 ) O(N^2) O(N2),原来是这样,我们了解了。
问题出在

			for (auto it = lastFind.begin(); it != lastFind.end(); it++) {
                if (check((*it) + 1, i)) {//如果前面合法,然后check也合法
                    lastFind.push_back(i);//那么到i这里肯定也合法
                    break;
                }
            }

这个for循环里面,因为每一次都要去重新寻找,所以我们可以优化一下,这样就不用去寻找了。
如果我们已经得到了check(0,i)是合法的,那么check(i+1,i+1+b[i+1])如果不为空的话,那么在i+1+b[i+1]这个位置上,肯定也是能找到的,这些相当于利用了b[i+1]因为i已经合法了嘛,那一个描述字符串长度的数字,要么在左边,要么在右边,这相当于用了check(i+1,i+1+b[i+1])的左边数字,就是这么回事。
当然如果利用右边的数字,那更好判断了。

所以我们对每一个数字思考,到底用左边数字还是右边数字:
(1)取右边数字:
在这里插入图片描述
那么因为2可以作为指示长度的数字,所以我们猜测,到蓝色的那个位置,我们到底能不能配凑出一个真正符合题目的串。如果符合,那太好了。

 dp[i]=dp[i - b[i] - 1];

(2)取左边边数字:
在这里插入图片描述
这要求,必须当前i一定是true的,那么就可以得知,红色8这个位置,因为2的描述,所以也应该是可以为True的。注意一步真没后效性,因为我们是根据前面的True和
False的出的。
好,那就直接看代码吧,不复杂。

代码(AC)

// VsCode C++模板 | (●'◡'●)
#include <bits/stdc++.h>

#include <iostream>
using namespace std;
typedef long long LL;
#define N 2 * 100000 + 5
int t, n, b[N];
bool dp[N + 5];
int main() {
    ios::sync_with_stdio(false);
    cin >> t;
    while (t--) {
        cin >> n;
        memset(dp, 0, sizeof(dp));
        for (int i = 0; i < n; i++) {
            cin >> b[i];
        }
        for (int i = 0; i < n; i++) {
            //作为右边的数字
            if (i != 0 && i - b[i] >= 0) {
                if (i - b[i] == 0 || dp[i - b[i] - 1] == true) {
                    dp[i] = true;
                }
            }
            //作为左边的数字
            if (i == 0 && i + b[i] < n) {
                dp[i + b[i]] = true;
                continue;
            }
            if (i != 0 && i + b[i] < n && dp[i - 1] == true) {
                dp[i + b[i]] = true;
            }
        }
        dp[n - 1] == true ? printf("YES\n") : printf("NO\n");
    }
    return 0;
}

结语

题解写得详细,只望君能看懂。

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

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

相关文章

岩藻多糖-聚乙二醇-胆固醇Cholesterol-PEG-FucoidanFucoidan-Cholesterol 岩藻多糖-胆固醇

岩藻多糖-聚乙二醇-胆固醇Cholesterol-PEG-FucoidanFucoidan-Cholesterol 岩藻多糖-胆固醇 中文名称&#xff1a;岩藻多糖-胆固醇 英文名称&#xff1a;Fucoidan-Cholesterol 别称&#xff1a;胆固醇修饰岩藻多糖&#xff0c;胆固醇-岩藻多糖 外观:固体或粘性液体&#xff…

终于有人将TWI(串行通讯接口)给讲通了!

目录 TWI的特性 数据传输格式 时钟同步 数据仲裁 功能描述 总线接口单元 频率生成单元 地址匹配单元 控制单元 传输模式 主机发送模式 主机接收模式 从机发送模式 从机接收模式 TWI的特性 两线模式&#xff0c;简单快捷&#xff1b;支持主机模式和从机模式&#xff…

「科普」如何评价供应商的MES系统

MES综合性很强&#xff0c;涉及到多个业务领域、多种技术和多专业&#xff0c;如何写好最难的投标技术方案呢&#xff1f;简搭(jabdp)根据多年经验&#xff0c;为大家进行梳理和分解&#xff0c;帮助发愁的你写出好方案&#xff01; MES是一个综合性很强的系统&#xff1a; 生…

68 - 令人迷惑的写法

---- 整理自狄泰软件唐佐林老师课程 1. 写法一 下面的程序想要表达什么意思&#xff1f; 1.1 历史原因 早期的C直接复用class关键字来定义模板 但是泛型编程针对的不只是类类型 class关键字的复用使得代码出现二义性 1.2 typename诞生的直接诱因 自定义类类型内部的嵌套…

猿如意|手把手教你下载、安装和配置PyCharm社区版

手把手教你使用猿如意下载、安装和配置PyCharm社区版&#xff0c;希望能帮助到有需要的童鞋。 文章目录前言一、下载安装猿如意二、安装PyCharm社区版1.通过猿如意找到PyCharm下载位置2.安装PyCharm三、对PyCharm社区版进行简单设置1.设置PyCharm社区版为中文2.安装第三方Pytho…

数据同步,还看Canal

一个系统最重要的是数据&#xff0c;有时对于一个业务场景&#xff0c;不单单是把数据保存在数据库中&#xff0c;还需要同步保存在ES&#xff0c;Redis等等中。这时阿里开源组件Canal由此而生&#xff0c;它可以同步数据库中的增量数据保存到其它存储应用中。 一、介绍 canal…

航空专场 | 无人机设计仿真流程讲解与案例实操

一、CFD在无人机上的应用 1、静、动气动系数计算以上介绍的无人机的流动状态一般为中低雷诺数&#xff0c;不可压缩流动。这些计算一般用S-A模型或者KW-SST模型进行计算&#xff0c;能够获得不错的工程精度。静、动气动力系数主要用于无人机操纵性和稳定性的分析&#xff0c;评…

串口 COM口,并口 LPT口,RS232、RS485、CAN

RS232 和 RS485 的区别 工作模式&#xff1a;RS232 为全双工&#xff0c;RS485 为半双工。 传输方式&#xff1a;RS485和RS232只是物理协议的通信&#xff08;即接口标准&#xff09;&#xff0c;RS485是差分传输方式&#xff0c;RS232是单端传输方式&#xff0c;但通信程序没有…

RabbitMQ_五种模式

1.Simple("Hello World") 构成&#xff1a;生产者、消费者、消息队列 配置类 构造函数参数&#xff1a;name durable exclusive autoDelete 仅创建队列&#xff0c;不创建交换机&#xff0c;也不进行队列和交换机的绑定 注&#xff1a;配置类置于生产者端或消费者…

如何处理 Angular 单页面应用里的 a 标签,避免点击后重新加载整个应用

问题描述 客户已经实现了一些“free html”组件&#xff0c;它是 HTML 的标题和包装器&#xff0c;与 OCC 响应一起作为内容。 <div [innerHTML]"data?.content | safeHtml"></div>这个 HTML 里包含了 anchor element&#xff1a; <div class&quo…

Linux源码——目录作用

Linux Linux是啥&#xff0c;不用多说&#xff0c;其源码结构也非常清晰。有以下理解&#xff1a; arch 每个系列的CPU都有一个对应的文件夹&#xff0c;里面包含每种CPU具体的操作&#xff0c;单独具体粗来每种CPU独有的管理或者操作。其他的文件夹都是通用的操作。 arch (…

孤核函数-isolation kernel

1.孤立核 一看到核函数&#xff0c;我们第一时间想到的就是核函数通过升维或者降维的方式来计算数据之间的相似度。他在SVM和聚类算法中应用广泛。 我们就直入主题来看一下孤核函数的数学推导。 在d维的空间分布着n个点。数学表达式为. 如图&#xff1a;一共20个点分布在2维空间…

浅析linux内核网络协议栈--linux bridge

1 . 前言 本文是参考附录上的资料整理而成&#xff0c;以帮助读者更好的理解kernel中brdige 模块代码。 2. 网桥的原理 2.1 桥接的概念 简单来说&#xff0c;桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是&#xff0c;其中一个网口收到的报文会被复制给其他…

深入了解BLE(Bluetooth 5.3)持续更新...

目录 1 BLE的优点和局限性 1.1 BLE与经典蓝牙的区别 1.2 局限性 1.2.1 数据吞吐量 1.2.2 范围 1.3 BLE优势及应用 1.4 BLE的角色 1.5 BLE的层次结构 1.5.1 物理层&#xff08;PHY&#xff09; 1.5.2 链路层 1.5.2.1 数据包格式 1.5.2.2 状态机 1.5.2.3 设备地址 …

PTA_1164 Good in C_模拟

PTA_1164 Good in C_模拟 1164 Good in C 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 When your interviewer asks you to write "Hello World" using C, can you do as the following figure shows? Input Specification: Each input file conta…

STM32实战总结:HAL之FSMC控制TFT-LCD

什么是FSMC&#xff1f; FSMC(Flexible Static Memory Controller&#xff0c;可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势&#xff0c;可根据系统的应用需要&#xff0c;方便地进行不同类型大容量静态存储器的扩展。 …

计算机网络 HTTP

概念 Web 基础 HTTP &#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;。WWW &#xff08;World Wide Web&#xff09;的三种技术&#xff1a;HTML、HTTP、URL。RFC&#xff08;Request for Comments&#xff0c;征求意见书&#xff09;&#…

HTTP DDOS攻击有什么类型和特点?

一、攻击类型 1、 HTTP floods 该攻击类型分为HTTP GET request floods和HTTP POST request floods两种形式&#xff0c;第一种攻击者通过构造HTTP GET请求报文&#xff0c;向目标服务器发送针对特定资源的大量请求&#xff1b;一条HTTP请求的成本很低&#xff0c;但是目标服…

力扣(LeetCode)124. 二叉树中的最大路径和(C++)

深度优先遍历 自底向上的递归。 对于二叉树&#xff0c;我们令每个结点作为 LCALCALCA (最近公共祖先)&#xff0c; 结点 uuu 作为 LCALCALCA &#xff0c; 经过它的最大路径 往左子树的最大路径 往右子树的最大路径 它自己的路径 。 有 ansmax(ans,vulrans max(ans,v_ul…

MobPush 厂商通道SDK集成指南

开发工具&#xff1a;Android Studio 集成方式&#xff1a;Gradle在线集成 安卓版本支持&#xff1a;minSdkVersion 19 集成准备 MobPush快速集成 在使用厂商通道之前&#xff0c;请确保您已申请MobTech开发者账号并已按照MobPush快速集成文档进行集成&#xff0c;本篇文档将…