平常水题

来源:互联网 发布:php 数组按某一值排序 编辑:程序博客网 时间:2024/05/17 01:23
蚂蚁
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;}



原创粉丝点击