版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_42373330/article/details/83115753
有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼?
Input
第1行:1个数N,表示鱼的数量(1 <= N <= 100000)。
第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
Output
输出1个数,表示最终剩下的鱼的数量。
Input示例
5
4 0
3 1
2 0
1 0
5 0
Output示例
2
这个简单模拟题 写得有点久啊,太蒻了
/*
1289
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define ll long long
const int N=1e5+10;
double len[N];
int vis[N];
double edg[N];
int main()
{
int n;
scanf("%d",&n);
memset(edg,0,sizeof(edg));//里面存的是鱼的长度
for(int i=0;i<n;i++)
{
scanf("%lf %d",&len[i],&vis[i]);
}
int ans=0;//计算被吃的鱼
int id=0;
for(int i=0;i<n;i++)
{
if(vis[i])//将vis是1的放入edg数组中
{
edg[++id]=len[i];
}
if(id>0&&vis[i]==0) //所有的吃与被吃的操作都在这里面
{
/*
if(len[i]>edg[id]) //右吃左 haiyaojixu
{
ans++;
edg[id]=len[i];
}
*/
//下面只是对edg里的鱼,和len[i]的的操作,且edg放的都是向右的鱼
//情况1 往左的鱼一进来就被吃 --下面的if语句
//2 往左的鱼没有把向右的鱼全吃掉--执行while后,edg[id]所代表的鱼就是吃掉len[i]的鱼,但while中没有计算len[i],
// 故在if中将ans++;
//3 往左的鱼所有的向右的鱼吃掉-- 执行while后,id=0,不会执行if(len[i]<edg[id)这部分
while(len[i]>edg[id]&&id>0)
{
edg[id]=0;
ans++;
id--;
}
if(len[i]<edg[id]) //左吃右,进入下一个for
{
ans++;
continue;
}
}
}
printf("%d\n",n-ans);
return 0;
}