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