当前位置: 首页 > news >正文

守序者的尊严

解题思路

问题分析

这是一个关于监控开关状态和移动策略的问题。监控按照1秒开启、1秒关闭的模式循环工作,小Z只能在监控关闭时通过多个监控。需要计算小Z安全通过所有监控的最短时间。

关键观察

  1. 监控状态变化:监控状态每秒交替变化(0→1→0→1...)
  2. 移动规则:小Z可以在监控关闭时一次性通过多个连续关闭的监控
  3. 策略分析:最优策略是在监控关闭的时段内尽可能多地通过监控

核心思路

原代码采用了一种巧妙的差分方法:

  • 计算相邻监控状态的差值(a[i] - a[i-1]
  • 每当状态发生变化时(差值不为0),说明需要等待新的时间窗口才能通过
  • 最终时间 = 初始时间1 + 状态变化次数

这是因为:

  • 初始状态第一个监控关闭,可以立即开始移动(计1时间单位)
  • 每次监控状态变化(0→1或1→0)意味着需要等待下一个时间窗口
  • 状态不变的区域可以在同一个时间窗口内一次性通过

代码注释

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define pii pair<ll,ll>
using namespace std;
const int N = 1e6 + 5;
int n,a[N], d[N]; // n:监控数量, a[]:监控状态数组, d[]:状态差分数组
int ans = 1; // 初始化答案为1,因为至少需要1个单位时间(即使所有监控都关闭)int main(){cin>>n; // 输入监控数量for(int i=1;i<=n;i++){cin>>a[i]; // 输入每个监控的初始状态(0或1)// 计算当前监控与前一个监控的状态差值d[i] = a[i] - a[i-1];// 如果状态发生变化(差值不为0),说明需要额外的时间窗口// 因为状态变化意味着监控开关状态交替,需要等待合适的时机才能通过if(d[i] != 0) ans++;}// 输出最终所需时间cout<<ans;return 0;
}

算法正确性解释

  1. 初始时间ans = 1 表示至少需要1个单位时间(即使所有监控都关闭,也需要1时间通过)
  2. 状态变化计数:每次监控状态变化(0→1或1→0)都需要额外的时间窗口:
    • 状态变化意味着监控开关模式交替
    • 小Z需要等待监控进入关闭状态才能通过
    • 每个状态变化对应一个额外的时间单位
http://www.hskmm.com/?act=detail&tid=10989

相关文章:

  • 在Ubuntu22.04平台上交叉编译针对Rv1126架构的GCC13.2.0编译器
  • 深度学习(DBBNet重参数化)
  • CAR 细胞疗法:肝癌治疗的曙光与荆棘
  • Java项目案例作业1
  • 配置Spring框架以连接SQL Server数据库
  • 这一辈子大多数日子是无聊的
  • Go 实现验证码识别
  • 跳出 AI 编程的「兔子洞」,4 个实战策略帮你解决90%的死循环
  • 用 PHP 和 Tesseract OCR 识别英文数字验证码
  • 凝望深渊时,深渊也凝望着你(黑洞与摇钱树)
  • 详细介绍:《Vuejs设计与实现》第 16 章(解析器) 中
  • spring项目部署后为什么会生成 logback-spring.xml记录
  • 【解决】Matlab函数体突然不自动缩进了
  • 202509_NBWS_logbool
  • Kubernetes权威指南-深入理解Pod Service
  • 详细介绍:jeecg-boot3.7.0对接钉钉登录(OAuth2.0)
  • C++编程软件 Dev-C++ 安装及使用流程
  • DLL植入漏洞分类与微软安全响应指南
  • 4980:拯救行动
  • java03-wxj
  • 题解:P13969 [VKOSHP 2024] Exchange and Deletion
  • 市场交易反心理特征之二:忽视热点切换的苗头
  • Linux服务器上安装配置GitLab的步骤
  • 贪心算法应用:投资组合再平衡问题详解 - 实践
  • MCP:Trae中集成Playwright 实现网页自动化测试
  • C语言中的字符、字符串及内存操作函数详细讲解
  • 06、訊息收集
  • 在Linux中设定账户密码的安全性策略
  • 精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具,助力轻松提升 Windows 系统性能与使用体验!
  • MySQL 32 为什么还有kill不掉的语句?