栈+模拟(大鱼吃小鱼)
#大鱼吃小鱼
有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
####问题分析:
此题在分析后采用栈这种存储结构较为简单,但需要注意的是只有当栈顶鱼向右而将要进栈的鱼向左时才会发生大鱼吃小鱼的情况,其他的都只需要将将要进栈的鱼压入栈顶即可,因为不会发生大鱼吃小鱼的情况,读者可自行在纸上模拟
####AC代码:
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
typedef struct{int fi;int flag;
}fish; //定义鱼这种结构体
int main()
{int n;stack<fish> s;while(~scanf("%d",&n)){fish f;for(int i = 1;i<=n;i++){scanf("%d%d",&f.fi,&f.flag);if(s.empty()){ //如果栈为空,直接将新的鱼压入 s.push(f);continue;}fish a = s.top();int sign = 1; while(a.flag == 1 && f.flag == 0){//如果出现了即将进栈的鱼与栈顶鱼发生冲突(大鱼吃小鱼) if(a.fi>f.fi){ //如果栈顶鱼比即将进栈的鱼大则吃掉它 sign = 0; //这里的标记改为1,表示该鱼已经被吃掉,不让其进栈 break; }s.pop(); //若即将进栈的鱼未被吃掉,说明栈顶鱼被吃掉 if(s.empty()) break; //若栈顶鱼被吃掉后,栈成空,则跳出循环,循环的目的是要考虑即将进栈的 鱼可能与栈顶之前的鱼也会发生冲突 a = s.top(); //执行到此,说明之前的栈顶鱼被吃掉了,而且栈不为空,所以将新的栈顶鱼赋值给a }if(sign) s.push(f); //在上面的for循环中,若即将进栈的鱼被吃掉了,则sign变成了0,若sign还为1说明它未与剩下的鱼发生冲突,或者,它把与它发生冲突的鱼都吃掉了 }printf("%d\n",s.size()); //打印还剩多少鱼 }return 0;
}
栈+模拟(大鱼吃小鱼)相关推荐
- 每日一套codeforce集训1119E[贪心],821C[栈模拟],645D[拓扑排序]
有n种长度的棍子,长度分别为2^0 ,2 ^ 1,-,2 ^ (n-1) ,每种棍子有a[i] 种,问你能组成多少个三角形. 三角形两边之和大于第三边,而2 ^ i + 2 ^ i = 2 ^ (i+ ...
- P1944 最长括号匹配(栈模拟/DP)
P1944 最长括号匹配 可以直接用栈模拟,把匹配好的标记一下, 最后找到最长的匹配输出即可. 如果是要求最长的长度的题那么只需要求数就行了,没必要把原序列真的按照题意改变 如果要求序列,那么只需要按 ...
- 【干货】容器适配器实现两个栈模拟队列
用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream ...
- Code POJ - 1780(栈模拟dfs)
题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...
- 括号配对问题----栈模拟
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100), ...
- HDU 3328 Flipper 栈 模拟
HDU 3328 Flipper 栈 模拟 首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边 ...
- 227 用栈模拟汉诺塔问题
原题网址:https://www.lintcode.com/problem/mock-hanoi-tower-by-stacks/description 描述 在经典的汉诺塔问题中,有 3 个塔和 N ...
- 栈模拟递归 遍历二叉树的正确写法
栈模拟递归 遍历二叉树的正确写法 二叉树的生成 树的层次遍历 前中后序遍历的递归实现 关于栈的实现 Reference 对于二叉树的生成,遍历,应该是树这个数据结构需要的基本功,只有真的理解了树的生成 ...
- 基础算法4 —— 结构体(成绩统计) + 栈(模拟进制转换 + 优秀的拆分) + 指针
结构体 结构体的实际应用场景: 在实际问题中,一组数据往往具有不同的数据类型.比如,某次期末考试中要记录一个学生的考试信息,除了有姓名(char)外,还有班级(int).性别(char).语文.数学. ...
- Ackermann函数(阿克曼函数)的递归、非递归(手动栈模拟)
目录 一.Ackermann函数 二.C++实现 1. 递归实现 2. 栈模拟递归 一.Ackermann函数 Ack(m,n)={n+1m=0Ack(m−1,1)m>0,n=0Ack(m−1, ...
最新文章
- 【Android】ActionBar的使用(1)
- 以后看下try,catch在C#下面的成本
- alluxio源码解析-层次化存储(4)
- 这个地球仪太惊艳了,陪孩子畅聊天文地理。
- 手把手教你如何逐步安装OpenStack
- maven 安装后变成 mvn 不是内部命令解决方法
- php代码怎么看错在哪里,PHP代码不知道哪里错了。
- Ubuntu 16.04中zabbix4.2设置中文显示
- weka连接mysql数据库
- JS - javascript容错处理代码
- Git使用ssh方式下载代码
- 行测相关题,在线测评——图形找规律、逻辑思维
- python for spss statistics_SPSS Statistics功能介绍
- 4.1 手工编写第一个Jmeter性能测试脚本
- aso优化应用市场推广方案怎么写
- 1.27(Bomb Game)
- goldendict for linux,GoldenDict(for Linux)配置无道词典
- 2021年中国棘轮手柄市场趋势报告、技术动态创新及2027年市场预测
- Spherical Harmonics Lighting in DirectX
- 音视频技术开发周刊 | 248