【天梯赛】L2-045 堆宝塔

简介: 最后 A 柱上剩下的宝塔作为一件成品,B 柱上剩下的彩虹圈被逐一取下,堆成另一座宝塔。堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。第二行按照宝宝抓取的顺序给出 N 个不超过 100 的正整数,对应每个彩虹圈的直径。//定义一个栈,T可以为int,float,double,char,string......在一行中输出宝宝堆出的宝塔个数,和最高的宝塔的层数。//检查栈是否为空,如果为空返回true,否则返回false。

1. 题目描述

image.png

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:

首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。
把第 1 块彩虹圈作为第 1 座宝塔的基座,在 A 柱放好。
将抓到的下一块彩虹圈 C 跟当前 A 柱宝塔最上面的彩虹圈比一下,如果比最上面的小,就直接放上去;否则把 C 跟 B 柱最上面的彩虹圈比一下:
如果 B 柱是空的、或者 C 大,就在 B 柱上放好;
否则把 A 柱上串好的宝塔取下来作为一件成品;然后把 B 柱上所有比 C 大的彩虹圈逐一取下放到 A 柱上,最后把 C 也放到 A 柱上。
重复此步骤,直到所有的彩虹圈都被抓完。最后 A 柱上剩下的宝塔作为一件成品,B 柱上剩下的彩虹圈被逐一取下,堆成另一座宝塔。问:宝宝一共堆出了几个宝塔?最高的宝塔有多少层?

输入格式:
输入第一行给出一个正整数 N(≤103),为彩虹圈的个数。第二行按照宝宝抓取的顺序给出 N 个不超过 100 的正整数,对应每个彩虹圈的直径。

输出格式:
在一行中输出宝宝堆出的宝塔个数,和最高的宝塔的层数。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

11
10 8 9 5 12 11 4 3 1 9 15

输出样例:

4 5

样例解释:
宝宝堆成的宝塔顺次为:

10、8、5
12、11、4、3、1
9
15、9

2. 思路分析

很明显的栈。调用C++ STL库中的stack的相关操作即可。

stack s; //定义一个栈,T可以为int,float,double,char,string......

s.push(x); //把x放到栈顶。

s.top(); //返回栈顶的元素

s.pop(); //删除栈顶的元素

s.size(); //返回栈中元素的个数。

s.empty(); //检查栈是否为空,如果为空返回true,否则返回false。

3. 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 1010;
stack<int> a, b;
int c[N];

int main() {
   
   
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n; cin >> n;
    for (int i = 1; i <= n; i++) cin >> c[i];
    a.push(c[1]);
    int cnt = 0, h = 0;
    for (int i = 2; i <= n; i++) {
   
   
        if (c[i] < a.top()) {
   
   
            a.push(c[i]);
        }else {
   
   
            if (b.empty() || c[i] > b.top()) {
   
   
                b.push(c[i]);
            }else {
   
   
                int sa = a.size();
                h = max(h, sa);
                while (!a.empty()) {
   
   
                    a.pop();
                }
                cnt++;
                while (!b.empty()&&b.top() > c[i]) {
   
   
                    a.push(b.top());
                    b.pop();
                }
                a.push(c[i]);
            }
        }
    }
    int lena = a.size();
    int lenb = b.size();
    h = max({
   
    h,lena,lenb });
    if (a.size()) cnt++;
    if (b.size()) cnt++;
    cout<<cnt<<" "<<h<<endl;
    return 0;
}

相关文章
|
C++
【PTA】​L1-006 连续因子​(C++)
【PTA】​L1-006 连续因子​(C++)
617 0
【PTA】​L1-006 连续因子​(C++)
|
存储 C++
【PTA】L1-039 古风排版(C++)
【PTA】L1-039 古风排版(C++)
207 1
|
Linux
Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!
其实就是 登录用户名错了,是 root,不是centos 也不是 ec2-user !  Xshell 连接配置界面如下   最重要是 登录授权配置  最后,登录成功! 就这么简单
3156 0
|
存储 定位技术
【天梯赛】L2-048 寻宝图 (DFS做法)
遇到一个非'0'字符(也就是'1'和 宝藏'2'到'9')就让ans++,同时将这个非'0'字符染色为'0',然后往四个方向(上、下、左、右)搜索,这里的目的是那一片岛屿(也就是那一片为'1'的部分)都染色为‘0’。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。为了判断有宝藏的岛屿,这里我开了一个全局变量f来判断这一片岛屿是否有宝藏(也就是有无字符'2'-'9'),当搜到字符'2'~'9'时就将f标记为1。在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
351 5
|
11月前
|
机器学习/深度学习 存储 人工智能
Attention优化重大突破!显存减半效率倍增
本文探讨了Transformer中Attention机制的演变与优化。从2017年Transformer提出以来,各种改进如MQA、GQA、MLA等层出不穷,旨在降低计算复杂度和显存消耗,同时保持模型性能。文章首先介绍了Attention的基本原理,通过QKV矩阵运算实现序列建模。接着分析了优化方法:kv caching将计算复杂度从O(n^3)降至O(n^2),但带来显存压力;MQA、GQA等通过减少或压缩K/V降低显存需求;而NSV、MoBA等稀疏化研究进一步缓解长序列下的计算与存储负担,推动大模型向更长上下文扩展。
EMNLP 2024 Oral | CoBa:均衡多任务收敛之道
我们提出了一种满足了以上两种需求的新的 MTL 方法——CoBa,旨在以最小的计算开销有效控制多任务收敛的平衡。CoBa 利用相对收敛分数(RCS)、绝对收敛分数(ACS)和发散因子(DF),在训练过程中动态地调整任务权重,确保所有任务的验证集损失以均匀的速度朝向收敛推进,同时缓解了个别任务提前发散的问题。本文在四个不同的多任务数据集上进行实验,结果表明,CoBa 不仅促进了任务收敛的平衡,而且与最佳基线方法相比,还使 LLMs 的性能至多提升了 13%。
259 3
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
575 1
|
C++
【PTA】​ L1-070 吃火锅​(C++)
【PTA】​ L1-070 吃火锅​(C++)
309 0
【PTA】​ L1-070 吃火锅​(C++)
|
C++
【PTA】L1-025 正整数A+B (C++)
【PTA】L1-025 正整数A+B (C++)
310 0
【PTA】L1-025 正整数A+B (C++)
|
机器学习/深度学习 人工智能 PyTorch
AI计算机视觉笔记三十二:LPRNet车牌识别
LPRNet是一种基于Pytorch的高性能、轻量级车牌识别框架,适用于中国及其他国家的车牌识别。该网络无需对字符进行预分割,采用端到端的轻量化设计,结合了squeezenet和inception的思想。其创新点在于去除了RNN,仅使用CNN与CTC Loss,并通过特定的卷积模块提取上下文信息。环境配置包括使用CPU开发板和Autodl训练环境。训练和测试过程需搭建虚拟环境并安装相关依赖,执行训练和测试脚本时可能遇到若干错误,需相应调整代码以确保正确运行。使用官方模型可获得较高的识别准确率,自行训练时建议增加训练轮数以提升效果。
1867 4