蚂蚁
Time limit per test: 0.5 seconds
Time limit all tests: 5.0 seconds
Memory limit: 256 megabytes
水平线上有 N 只蚂蚁,每只蚂蚁的位置及大小均不同。他们沿着 X 轴爬行,有的向左,有的向右,爬行的速度是一样的,两只蚂蚁相遇大一点的会吃掉小的。
现在从左到右给出每只蚂蚁的大小和爬行的方向(0 表示向左,1 表示向右)。问足够长的时间之后,能剩下多少只蚂蚁?
Input
第 1 行:一个整数 N,表示蚂蚁的数量 (1≤N≤105)。
第 2 到 N+1 行:每行两个数 Ai,Bi (1≤Ai≤109,Bi∈{0,1}),中间用空格分隔,分别表示蚂蚁的大小及爬
行的方向,Bi=0 表示向左,Bi=1 表示向右。
对于 3/8 的数据,存在 x 满足:所有坐标比 x 小的蚂蚁向左爬、坐标比 x 大的蚂蚁向右爬;或者所有坐标比 x 小的蚂蚁向右爬、坐标比 x 大的蚂蚁向左爬。
Output
输出最终剩下的蚂蚁的数量。
Examples
input
5
4 0
3 1
2 0
1 0
5 0
output
Time limit per test: 0.5 seconds
Time limit all tests: 5.0 seconds
Memory limit: 256 megabytes
水平线上有 N 只蚂蚁,每只蚂蚁的位置及大小均不同。他们沿着 X 轴爬行,有的向左,有的向右,爬行的速度是一样的,两只蚂蚁相遇大一点的会吃掉小的。
现在从左到右给出每只蚂蚁的大小和爬行的方向(0 表示向左,1 表示向右)。问足够长的时间之后,能剩下多少只蚂蚁?
Input
第 1 行:一个整数 N,表示蚂蚁的数量 (1≤N≤105)。
第 2 到 N+1 行:每行两个数 Ai,Bi (1≤Ai≤109,Bi∈{0,1}),中间用空格分隔,分别表示蚂蚁的大小及爬
行的方向,Bi=0 表示向左,Bi=1 表示向右。
对于 3/8 的数据,存在 x 满足:所有坐标比 x 小的蚂蚁向左爬、坐标比 x 大的蚂蚁向右爬;或者所有坐标比 x 小的蚂蚁向右爬、坐标比 x 大的蚂蚁向左爬。
Output
输出最终剩下的蚂蚁的数量。
Examples
input
5
4 0
3 1
2 0
1 0
5 0
output
2
题意:有n只蚂蚁,从左到右排列着,每只蚂蚁有自己的大小,如果两只蚂蚁相遇,则较大的蚂蚁会吃掉较小的蚂蚁并继续朝着原来的方向移动。(每只蚂蚁的大小不同,但速度相同,也就是说同方向移动的蚂蚁永远不会相遇,1代表蚂蚁向右移动,0代表蚂蚁向左移动。)
解题思路:简单模拟。主要是对栈的使用,栈的特质:后进先出。若是向右的移动的蚂蚁就放进栈里,若是向左的蚂蚁,则比较这只蚂蚁与最后放进栈(向左移动)的蚂蚁的大小。若向右的蚂蚁比向左的蚂蚁大,删除最后放进栈的蚂蚁,并继续比较栈剩下的蚂蚁大小,剩下的蚂蚁总数减一。若向右的蚂蚁比向向左的蚂蚁小,及继续枚举下一个蚂蚁。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
using namespace std;
stack<long long>k;
int main(){
int n,p;
long long s;
scanf("%d",&n);
int ans = n;
for(int i = 1;i <= ans;i++){
scanf("%lld %d",&s,&p);
if(p == 1){
k.push(s);
}
else if(p == 0){
while(!k.empty()){
if(s > k.top()){
n--;
k.pop();
}
else{
n--;
break;
}
}
}
}
printf("%d",n);
return 0;
}