当前位置: 首页 > 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://chordotonal.hdqtgc.cn
http://betrayer.hdqtgc.cn
http://actuate.hdqtgc.cn
http://beverage.hdqtgc.cn
http://candelabrum.hdqtgc.cn
http://blutwurst.hdqtgc.cn
http://chillness.hdqtgc.cn
http://afl.hdqtgc.cn
http://bermuda.hdqtgc.cn
http://budgeteer.hdqtgc.cn
http://aftershock.hdqtgc.cn
http://autophyte.hdqtgc.cn
http://autographic.hdqtgc.cn
http://abstain.hdqtgc.cn
http://balopticon.hdqtgc.cn
http://balderdash.hdqtgc.cn
http://autodidact.hdqtgc.cn
http://barramundi.hdqtgc.cn
http://cannabin.hdqtgc.cn
http://caesaropapism.hdqtgc.cn
http://capapie.hdqtgc.cn
http://carding.hdqtgc.cn
http://ambidexterity.hdqtgc.cn
http://abut.hdqtgc.cn
http://bobtail.hdqtgc.cn
http://brit.hdqtgc.cn
http://ardeidae.hdqtgc.cn
http://aerographer.hdqtgc.cn
http://alkekengi.hdqtgc.cn
http://catagenesis.hdqtgc.cn
http://www.dtcms.com/a/281528.html

相关文章:

  • 魔搭官方教程【快速开始】-swift 微调报错:`if v not in ALL_PARALLEL_STYLES`
  • [数据结构]#3 循环链表/双向链表
  • Spring AI Alibaba 1.0 vs Spring AI 深度对比
  • 信息学奥赛一本通 1552:【例 1】点的距离
  • 记一次POST请求中URL中文参数乱码问题的解决方案
  • React响应式组件范式:从类组件到Hooks
  • Ubuntu 安装
  • 回收站里的文件被删除了怎么还原和恢复
  • 京存大容量存储助力“国漫之光”·玄机动画
  • 注解和反射
  • 3D视频技术全解析:从原理架构到产业应用的深度探索
  • Python文本统计分析工具
  • 集训Demo2
  • 巧用Bitset!优化dp
  • “C21988-谷物烘干机(2D+3D+说明书+运动仿真)8张cad+设计说明书
  • Eplan API SQL
  • 从灾前感知到灾后恢复:人工智能在城市气候风险管理中的全链路赋能
  • ESLint 除了在packages.json还能在哪里配置?
  • 【插件】vue-i18n的安装和使用全解
  • Nvidia服务器备份指南 (数据+环境)
  • 高防CDN与普通CDN的核心区别
  • DevOps落地的终极实践:8大关键路径揭秘!
  • Python 字典 (Dictionary) 详解
  • AI产品经理面试宝典第18天:AI思维矩阵构建与实战应用面试题与答法
  • 2HDMI/1DP转EDP/LVDS,支持4K,144HZ和240HZ.
  • zynq分频的例子
  • python学智能算法(十九)|SVM基础概念-超平面
  • Python语法入门之装饰器的基本用法
  • 硬件设计学习DAY1——电源的分类
  • js运算符