平常水题 - 蚂蚁(栈的使用)

本文介绍了一种通过栈实现的简单模拟算法来解决蚂蚁碰撞问题的方法。问题设定为一定数量的蚂蚁在线性路径上移动,当大小不同的蚂蚁相遇时,较大的蚂蚁会吃掉较小的蚂蚁。文章提供了一个C++实现的示例,展示了如何通过栈结构来跟踪并计算最终剩余的蚂蚁数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蚂蚁
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值