https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1289
思路:
如果当前这只鱼往左走,且他的左边没有鱼,那么这只鱼一定存活
他的左边有鱼,那么比较他与左边的鱼的大小,判断生死
如果当前这只鱼往右走,那么他的存活状态当前无法判断,需要判断在下面的值中往左走的鱼同他的大小关系。
因此用stack操作,如果向右入栈,向左则比较栈中值与他的关系。如果栈为空且向左,那么这只鱼必定存在
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
int a[100005];
int b[100005];
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
stack <int >q;
int i=1;
while(i<=n)
{
if(q.empty()&&b[i]==0)
{
sum++;
i++;
continue;
}
if(q.empty()&&b[i]==1)
{q.push(a[i]);
i++;
continue;
}
if(!q.empty()&&b[i]==1)
{
q.push(a[i]);
i++;
continue;
}
if(!q.empty()&&b[i]==0)
{
int t;
t=q.top();
while(t<a[i])
{
q.pop();
if(q.empty())
break;
t=q.top();
}
if(q.empty())
sum++;
}
i++;
}
cout<<sum+q.size()<<endl;
return 0;
}