51nod1289大鱼吃小鱼(栈模拟)

只有你 只有你     2022-09-10     502

关键词:

题目来源: Codility
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
技术分享 收藏
技术分享 关注
技术分享 取消关注
有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

用栈来存储b[i]=1的鱼(向右移动的,要去战斗的),当遇到b[i]=0的鱼(向左移动的,来挑战的),双方血拼,用ans记录牺牲的鱼。
最终剩下的鱼=n-ans;

技术分享
 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 int a[100005];
 5 int b[100005];
 6 stack<int> sta;
 7 int main()
 8 {
 9     int n;
10     int ans=0;
11     cin>>n;
12     for(int i=0;i<n;i++)
13     {
14         cin>>a[i];
15         cin>>b[i];
16     }
17     for(int i=0;i<n;i++)
18     {
19         if(b[i]==0&&sta.empty())
20             continue;
21         if(b[i]==1)
22         {
23             sta.push(a[i]);
24             continue;
25         }
26         while(!sta.empty())
27         {
28             int tmp=sta.top();
29             sta.pop();
30             if(tmp>a[i])
31             {
32                 ans++;
33                 sta.push(tmp);
34                 break;
35             }
36             ans++;
37         }
38     }
39     cout<<n-ans<<endl;
40     return 0;
41 }
View Code

 

 





51nod1289大鱼吃小鱼

  Input示例54 03 12 01 05 0Output示例2 死者:213栈模拟把向右的鱼看成左括号进栈,向左的鱼看成右括号出栈。答案为没被吃掉的向左的鱼和最后剩在栈里的向右的鱼的个数之和。 #include<iostream>#... 查看详情

51nod-1289大鱼吃小鱼

题目链接:1289 大鱼吃小鱼 思路:如果把向右的鱼丢进栈里。如果出现向左的鱼,那么让它跟栈里的鱼互吃。如果栈里的鱼都被它吃光,那么答案+1。最后答案加上栈里的鱼。1#include<bits/stdc++.h>2usingnamespacestd;34intmain()... 查看详情

51nod1289大鱼吃小鱼

#include<bits/stdc++.h>usingnamespacestd;constintmaxn=100100;inta[maxn],b[maxn];stack<int>s;intmain(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>a[i]>>b[i];intans=0;for(inti 查看详情

51nod1289stack

1289 大鱼吃小鱼题目来源: Codility基准时间限制:1 秒空间限制:131072 KB分值: 5 难度:1级算法题 收藏 关注有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度... 查看详情

大鱼吃小鱼(简单模拟)

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1289从左往右将数字压入栈里(想象成一个水平向右的栈),如果鱼是向左的让它一直吃,直到被吃或者吃完为止importjava.util.Scanner;importjava.util.Stack;publicclassN1289{privatestaticScann... 查看详情

1289大鱼吃小鱼

模拟,在这里用栈模拟,一开始用了结构体数组从首尾两端分别遍历果断超时,复杂度n*n,用栈来模拟是线性复杂度。#include<iostream>#include<algorithm>#include<vector>#include<cstring>#include<cstdio>#include<queue>#includ... 查看详情

1289大鱼吃小鱼(栈)

1289 大鱼吃小鱼有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够... 查看详情

51nod1102面积最大的矩形(单调栈)

...明前面比它大的那些数最多只能延伸到它这里。自己手动模拟一下就可以了。1#inclu 查看详情

1289大鱼吃小鱼1305pairwisesumanddivide1344走格子1347旋转字符串1381硬币游戏

1289大鱼吃小鱼 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够... 查看详情

1289大鱼吃小鱼(stl中栈的应用)(代码片段)

》》点击进入测试《《有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问... 查看详情

51nod1623完美消除(数位dp)

... 因为数的范围只有0~9,所以我们可以用一个二进制数来模拟这个栈,并塞到DP的状态里。  设$dp[i][j][k]$表示前i位数,已经进行了j次操作,栈的状态为k的方案数。  每次枚举一个数的时候,先把比这个数大的数在状态中都... 查看详情

51nod1437迈克步(单调栈)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437题意: 思路:单调栈题。求出以每个数为区间最大值的区间范围即可。1#include<iostream>2#include<algorithm>3#include<cstring>4#include<cstdio> 查看详情

51nod1102(单调栈/预处理)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意:中文题诶~ 思路:单调栈/预处理 (这篇博客就不细写了啦,只给出代码和转过来的两篇不错的题解,好困了~) 单调栈:http://blog.csdn.net/u012773... 查看详情

51nod1279单调栈

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=12791279扔盘子题目来源:Codility基准时间限制:1秒空间限制:131072KB分值:10难度:2级算法题收藏关注有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘... 查看详情

51nod1952栈

1952 栈基准时间限制:1.5 秒空间限制:262144 KB分值: 80 难度:5级算法题LYK有一个栈,众所周知的是这个数据结构的特性是后进先出的。LYK感觉这样子不太美妙,于是它决定在这个前提下将其改进,也就是说,... 查看详情

51nod1215单调栈/迭代

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=12151215数组的宽度题目来源:Javaman基准时间限制:1秒空间限制:131072KB分值:80难度:5级算法题收藏关注N个整数组成的数组,定义子数组a[i]..a[j]的宽度为:max(a[i]..a[j])-min(a[i]..a[j]),... 查看详情

51nod1349最大值(单调栈)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1349题意:求区间内最大值大于等于k的区间个数。 思路:利用求出对于以a[i]为最大值的区间范围,pre[i]表示左端范围,aft[i]表示右端范围,则区间个数为$(i-pre[i]+1)*(aft[i]-i+1)$。1... 查看详情

51nod1962区间计数(单调栈+二分)

  维护两个单调递减的栈,当i加进栈,位置x的数弹出的时候,在另一个栈中找到和这个数一样大的数,计算贡献(x-靠右左端点)*(i-x)。#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorith... 查看详情