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

华为OD 特异双端队列

1. 题意

题目描述
有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。

小 A 依次执行 2n 个指令往队列中添加数据和移出数据:

其中 n 个指令是添加数据(可能从头部添加,也可能从尾部添加),依次添加 1 到 n;
n 个指令是移出数据。

现在要求 移除数据的顺序为 1 到 n。

为了满足输出要求,小 A 可以在任何时候调整队列中数据的顺序。

请问小 A 最少需要调整几次 才能够满足移除数据的顺序正好是 1 到 n?

2. 题解

这个题目,一开始没有仔细读题,于是直接插入双端队列,
然后进行排序。

但是题目中最重要的一个条件,依次添加1-n

2.1 直接排序
int n;
int ans;
int expect = 1;deque<int> dq;
string head_add_str("head add");
string tail_add_str("tail add");auto getNum = [](const std::string &s)->int {string nstr(s.begin() + 9, s.end());return stoi(nstr);};void solve1()
{
string head_add_str("head add");string tail_add_str("tail add");for (int i = 0; i < 2 * n; ++i) {string cmd;getline( cin, cmd);if ( cmd == "remove") {if ( dq.front() != expect) {ans++;sort(dq.begin(), dq.end());}dq.pop_front();++expect;}else if ( cmd.substr(0, 8) == head_add_str) {int v = getNum( cmd );dq.push_front( v );}else if ( cmd.substr(0, 8) == tail_add_str) {int v = getNum( cmd );dq.push_back( v );}}
}
2.2 根据有序性,直接赋值

由于插入时是有序的,因此我们知道最大值和最小值时就可以知道排序后的结果。直接放进队列就可以!

void solve2()
{int mx_pushed = 0;for (int i = 0; i < 2 * n; ++i) {string cmd;getline( cin, cmd);if ( cmd == "remove") {if ( dq.front() != expect) {ans++;// sort(dq.begin(), dq.end());dq.clear();for (int i = expect; i <= mx_pushed; ++i)dq.push_back(i);}dq.pop_front();++expect;}else if ( cmd.substr(0, 8) == head_add_str) {int v = getNum( cmd );dq.push_front( v );++mx_pushed;}else if ( cmd.substr(0, 8) == tail_add_str) {int v = getNum( cmd );dq.push_back( v );++mx_pushed;}}
}
2.3 空间优化

事实上我们还可以利用插入数据的有序性进一步优化!!!

我们只需要知道队列是否是有序就可以了,队列中的区间肯定是[expext,max_pushed][expext,max\_pushed][expext,max_pushed]

而在队列后面插入一个新的元素是不会破坏队列的有序性的,只有当队列中有元素且在队列头插入新元素时,才会破坏队列的有序性!

因此我们可以将队列直接优化掉,直接维护三个变量就可以了

  • expect 下一次期望的出队元素
  • max_pushed 已经入队的最大元素
  • is_sorted 队列中的元素是否是有序的
void solve3()
{ans = 0;int mx_pushed = 0;bool is_sorted{true};for (int i = 0; i < 2 * n; ++i) {string cmd;getline( cin, cmd);if ( cmd == "remove") {if ( not is_sorted) {is_sorted = true;ans++;}++expect;}else if ( cmd.substr(0, 8) == head_add_str) {++mx_pushed;if (mx_pushed != expect)is_sorted = false;}else if ( cmd.substr(0, 8) == tail_add_str) {++mx_pushed;}}}

3. 参考

KJ.JK

http://www.lryc.cn/news/589622.html

相关文章:

  • TDengine GREATEST 和 LEAST 函数用户手册
  • DirectX12(D3D12)基础教程九 间接绘制
  • Unity灯光面板环境设置
  • 区块链发展史全景长图
  • [面试] 手写题-对象数组根据某个字段进行分组
  • kiro, 新款 AI 编辑器, 简单了解一下
  • ov5640,ov2640,ov7670摄像头比较
  • IPD-流程设计-DT角色说明书参考模板
  • 本地 LLM API Python 项目分步指南
  • 10分钟搞定!Chatbox+本地知识库=你的私人语音导师:企业级全栈实现指南
  • 【C语言进阶】字符函数和字符串函数的内部原理
  • 一区 Top (HPJ) | WGAS+WGCNA分析文章套路
  • 详解低速容错CAN(附与高速CAN对比表)
  • 区块链:以太坊侧链Polygon
  • 简单工厂设计模式
  • I/O 多路复用详解笔记
  • JS中async/await功能介绍和使用演示
  • [Dify]--进阶3-- 如何通过插件扩展 Dify 的功能能力
  • 基于华为欧拉系统安装FileGator文件管理器
  • screen -r 2050449 # 重新连接到 run_models 会话
  • saltstack安装部署
  • docker搭建freeswitch实现点对点视频,多人视频
  • vscode里面怎么配置ssh步骤
  • 【PTA数据结构 | C语言版】层序遍历二叉树
  • js分支语句和循环语句
  • 小架构step系列15:白盒集成测试
  • NE综合实验3:链路聚合、VLAN与Trunk、STP、DHCP、OSPF及PPP整合部署
  • 经典排序算法之插入排序
  • 二分查找栈堆
  • 笔试——Day8