12月4日学习总结

 今天有点小开心,虽然班级团建玩的不是很开心,但参观了武陵源人间仙境般的美景不禁感叹“人在江湖我醉醒,此心常自有沧萍。”时间掩埋了一切,只留下了美好的回忆。今天没有看更多的知识点,知识写了两道关于栈的题,但是第二题用栈写的实在过不了,最后迫不得已才用数组解决。

首先我们来看第一题:

Farmer John的奶牛在风中凌乱了它们的发型……
每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。对于奶牛i来说,如果奶牛i+1,i+2,……,N这些奶牛的身高严格小于奶牛i,则奶牛i可以看到它们凌乱的发型。
比如下面这个例子:

* * * * = *
= * * * = *
= * - * = * 奶牛面向这边-->
= * = * = *
= - = = = *
= = = = = =
1 2 3 4 5 6
('*'表示空的,这是译者为了格式特意弄的,原题没有)

令ci表示第i只奶牛能够看到的发型数量,请计算c1 + c2 + c3 + … + cN的值
对于上面这个例子,答案为3 + 0 + 1 + 0 + 1 + 0=5。

输入

第一行:奶牛数量N
第二到N+1行:第i+1行输入奶牛i的身高

输出

第一行:一个整数即c1到cN的和

样例输入

6
10
3
7
4
12
2

样例输出

5

这一道题是广为流传的单调栈吧,那我来再捋一下的解题思路:

首先,我们来分析一下答案五的来历

因为10他比3,7,4的都高,所以他可以看见三个发型数,但是他被12挡住了,所以他看不到2的发型,那么对于3而言,他直接被7挡住了,所以他能看到的发型数字为零,对于7则它能看到4的发型,但他被12挡住了,所以到目前总共能看到的发型数位4,对于12它能看到2的发型,但是2之前没有数字了,所以总共可以看到的发型数为5.

#include <iostream>
#include <stack>
using namespace std;
typedef long long ll;   //没什么特殊含义,就是懒得打太长的(long long)将他重新定义
ll a[10000001]={0};
int main()
{
    ll n,ans = 0,count = 0;     
    stack<ll>st;        //d调用库函数中的栈
    cin>>n;
    for(ll i=0;i<n;i++)
        cin>>a[i];
        a[n] = 5000000001;  //可以算是一个哨兵,为了找比a[n - 1]的数做准备,应为是递减栈,所以设为极大值
    for(ll i=0;i<=n;i++)
       {
           if(st.empty()||a[i]<a[st.top()])//栈为空,后者当前数组元素小于栈顶元素,则将数组元素入栈
                st.push(i);
            else
            {
                while(!st.empty()&&a[i]>=a[st.top()])
                {//当栈不为空并且数组元素小于或者等于栈顶元素,则弹出
                    count = st.top(); st.pop();
                    ans = ans + i - count - 1;  //记录能够看到的发型数
                }
                st.push(i);
            }
       }
       cout<<ans;
       return 0;
}

第二道:

羊羊们到了谈婚论嫁的年龄了,雷巨巨有的忙了。他有四种羊,每种羊分公母且公母才能配对,为方便输入用[]<>(){}代替四种羊,一天他让一些羊羊站成一排开始配对,有如下定义:假设s1和s2是满足配对的,则s2,{s1}s2,[s1]s2,(s1)s2也是满足配对的,如"[[(){}]<>]"和"{[(<>)]}"是满足配对的,而"<)()"和"]><["是不满足的,雷巨巨可以选择让其中一种羊变成另一种羊但无法改变其性别,如'<'可以变成'(','{','['但不可变成')','}',']'。问至少改变几次才能让羊羊们都找到幸福。

Input

输入一行字符串,仅由四种括号组成,长度不超过1e6

Output

如果不能使所有羊羊配对,则打印"Impossible",否则,打印最少替换的次数

Examples

Input

[<}){}

Output

2

Input

{()}[]

Output

0

Input

]]

Output

Impossible

大佬们给我看看,我哪里出错了,测了好多组数据,都没有毛病,就是过不了。

#include <iostream>
#include <string.h>
#include <stack>
using namespace std;
int main()
{
    stack<char>s;
    char str[100000]=" ";
    gets(str);
    long long lenth = strlen(str),a=0,b=0;
    for(int i=0;i<lenth;i++)
    {
        if(s.empty()&&(str[i] =='{'||str[i] =='<'||str[i] == '('||str[i] == '['))
            s.push(str[i]);
       else if(s.empty()&&(str[i] =='}'||str[i] =='>'||str[i] == ')'||str[i] == ']'))
            {
                s.push(str[i]);
                a = 1;
                goto q1;
            }
        else
        {
            switch(str[i])
            {
                case '}':
                    if('{' == s.top()) {s.pop();break;}
                    else{s.push(str[i]);break;}
                case '>':
                    if('<' == s.top()){s.pop();break;}
                    else {s.push(str[i]);break;}
                case ')':
                    if('(' == s.top()){s.pop();break;}
                    else{s.push(str[i]);break;}
                    case ']':
                    if('[' == s.top()) {s.pop();break;}
                    else{s.push(str[i]);break;}
                case '[':s.push(str[i]);break;
                case '{':s.push(str[i]);break;
                case '<':s.push(str[i]);break;
                case '(':s.push(str[i]);break;
            }
        }
    }
    if(s.empty())
        cout<<"0";
    else
    {
       while(!s.empty())
        {
           switch(s.top())
            {
            case '{':a++;s.pop();if(a>b)  goto q1;else break;
            case '<':a++;s.pop();if(a>b)  goto q1;else break;
            case '(':a++;s.pop();if(a>b)  goto q1;else break;
            case '[':a++;s.pop();if(a>b)  goto q1;else break;
            case '}':b++;s.pop();break;
            case '>':b++;s.pop();break;
            case ')':b++;s.pop();break;
            case ']':b++;s.pop();break;

            }
        }
       q1:
        if(b!=a)
           cout<<"Impossible";
        else if(a == b)
          cout<<a;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值