https://www.51nod.com/Challenge/Problem.html#!#problemId=1289
有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼?
输入
第1行:1个数N,表示鱼的数量(1 <= N <= 100000)。
第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
输出
输出1个数,表示最终剩下的鱼的数量。
输入样例
5
4 0
3 1
2 0
1 0
5 0
输出样例
2
如果鱼的头是向右的就把鱼入栈,如果鱼头向左,就让它向左走吃鱼直到被吃或者走的尽头。
#include<stdio.h>
#define N 100020
int a[N];
int main()
{
int n,i,len,j,sum,temp,s;
scanf("%d",&n);
len=1;
sum=0;
while(n--)
{
scanf("%d%d",&s,&temp);
if(temp==1)
{
a[len]=s;
len++;
}
else
{
if(len==1)
sum++;
else
{
for(i=len-1;i>=1;i--)
if(a[i]>=s)
break;
len=i+1;
if(len==1)
sum++;
}
}
}
printf("%d
",sum+len-1);
return 0;
}
一道相似的题目:
2160:数字游戏
现在有n个数字依次进入一个栈,每个数字a进入栈的时候,如果栈顶元素小于a,则会将栈顶元素弹出,新的栈顶元素如果仍然小于a,则会将新的栈顶元素继续弹出,直到栈顶元素大于等于a为止,a才会加入栈。问n个数字依次进入后,最后栈里的数字依次是?
输入
输入第一行一个整数n(n<=100000),表示有n个数字依次进入栈。
接下来n行,每行一个整数,表示第i个数字。
输出
若干行,表示最后栈中的数字。
输入样例
5
5
3
2
4
1
输出样例
5
4
1
#include<stdio.h>
#define N 100020
int a[N];
int main()
{
int n,i,j,num;
scanf("%d",&n);
i=1;
n--;
scanf("%d",&a[1]);
while(n--)
{
scanf("%d",&num);
for(j=i;j>=1;j--)
{
if(a[j]>=num)
{
a[j+1]=num;
break;
}
}
if(j==0)
a[1]=num;
i=j+1;
}
for(j=1;j<=i;j++)
printf("%d
",a[j]);
}