您好,欢迎来到刀刀网。
搜索
您的当前位置:首页PTA L2-045 堆宝塔 (25 分)

PTA L2-045 堆宝塔 (25 分)

来源:刀刀网

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

  • 首先准备两根柱子,一根 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

建立两个栈 ,直接模拟题目

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>

using namespace std;

const int N = 1e3 + 10;

int h[N];
int n;

int main()
{
    
    cin >> n;
    for(int i = 1; i <= n; i ++)
    {
        cin >> h[i];
    }
    
    int mx = 0;
    int cnt = 0;
    stack<int> a;
    a.push(h[1]);
    
    stack<int> b;
    
    for(int i = 2; i <= n; i ++)
    {
    // 	cout << h[i]<<endl;
    	
        int t = a.top();
        if(h[i] < t)
        {
            a.push(h[i]);
        }
        else{
            if(!b.size())
            {
                b.push(h[i]);
            }
            else if(h[i] > b.top()){
                b.push(h[i]);
            }
            else{
            	int p = a.size();
                mx = max(mx,p);
//                a.clear();
				while(a.size())
				{
					a.pop();
				}
                cnt ++;
                // cout << cnt << " " << mx;
                if(b.size())
                {
                    while(b.size())
                    {
                        int k = b.top();
                        if(h[i] < k)
                        {
                            a.push(k);
                            b.pop();
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                a.push(h[i]);
            }
        }
    }
    int x = a.size();
	int y = b.size() ;
    if(a.size())
    {
        cnt ++;
        mx = max(mx,x);
    }
    if(b.size())
    {
        cnt ++;
        mx = max(mx,y);
    }    
    cout << cnt << " " << mx;
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务