这道题确实非常有趣,一直在想着用什么数据结构实现这个算法。最后看了下别人的思路瞬间明白了,原来还能用栈实现。然后总结了一下,好像如果问题涉及到顺序优先的时候应该都可以考虑一下栈。(如计算算数式,就是用栈来实现运算的优先级)。这道题的主要思路是,如果遇到朝向右游的鱼就把它入栈,如果是遇到朝向左的鱼则将其大小与栈顶的鱼做比较,如果大于栈顶的鱼则栈顶的鱼出栈,鱼的总数减一直到栈顶的鱼大于向左的鱼或者空栈;如果小于则栈顶原封不动,鱼的条数减一。
#include<cstdio>
#include<stack>
using namespace std;
const int maxn=1e5+5;
int n,t,w,cnt;
int main(){
while(scanf("%d",&n)!=EOF){
cnt=0;
stack<int> s;
for(int i=0;i<n;i++){
cnt++;
scanf("%d%d",&w,&t);
if(t==1)
s.push(w);
if(t==0){
while(!s.empty()){
if(s.top()>w){
cnt--;
break;
}
if(s.top()<w){
cnt--;
s.pop();
}
}
}
}
printf("%d\n",cnt);
}
return 0;
}