头歌 蚂蚁王国

题目描述

众所周知,蚂蚁是一种十分神奇的生物,在算法设计中,我们往往能从它身上得到启发,例如在求解TSP问题中,就有一种模仿蚂蚁行为方式而设计出的蚁群算法。 今天,我们也来从蚂蚁身上寻找一些灵感。 假设水平线上有N只蚂蚁,每只蚂蚁的位置及大小均不同。他们沿着X轴爬行,有的向左,有的向右,爬行的速度是一样的,两只蚂蚁相遇时,大一点的蚂蚁会吃掉小一点的(假设吃掉的时间可以忽略不计)。现在,从左到右给出每只蚂蚁的大小和爬行的方向(0表示向左,1表示向右)。问:足够长的时间之后,能剩下多少只蚂蚁?

输入输出格式

首先输入测试数据的组数t,后面是t组测试数据。 输入格式 第1行:一个整数N,表示蚂蚁的数量 (1≤N≤100)。 第2到N+1行:每行两个数 Ai,Bi (1≤Ai≤N,Bi∈{0,1}),中间用一个空格分隔,分别表示蚂蚁的大小以及爬行的方向,Bi=0 表示向左,Bi=1 表示向右。 输出格式 对于每组测试数据,输出最终剩下的蚂蚁的数量。所以最终应该会有t行输出数据。

输入输出样例1

输入 2 1 1 1 5 4 0 3 1 2 0 1 0 5 0 输出 1 2

样例说明

样例中共有两组测试数据。第一组中只有1只蚂蚁,大小为1,向右爬行。所以最终会剩下这只蚂蚁。第二组中共有5只蚂蚁,从左到右依次为:第一只大小为4,向左爬行;第二只大小为3,向右爬行;第三只大小为2,向左爬行;第四只大小为1,向左爬行;第五只大小为5,向左爬行。第二只蚂蚁在向右爬行的过程中,会先后吃掉第三只和第四只蚂蚁,然后被第五只蚂蚁吃掉。由于所有蚂蚁的爬行速度是相同的,所以最终会剩下第一只和第五只蚂蚁。

友情提示

如果你能想到堆栈的话,那么这个问题就解决一半了。 ---------祝你顺利通关!

#include <bits/stdc++.h>
using namespace std;
struct ant{
	int dir;//0 is left  ; 1 is right
	int size;
};
int main()
{
	stack<ant> st;
    int t;
    cin>>t;
    while(!st.empty()){
    	st.pop();
	}
    while(t--){
    	int N;
    	cin>>N;
    	ant ants[10086];
    	for(int i=1;i<=N;i++){
    		cin>>ants[i].size>>ants[i].dir;
    		if(st.empty()){
    			st.push(ants[i]);
			}
			else {
				if(st.top().dir==1&&ants[i].dir==0&&st.top().size>ants[i].size){
					continue;
				}
				else if(st.top().dir==1&&ants[i].dir==0&&st.top().size<ants[i].size){
					while(!st.empty()&&st.top().dir==1&&st.top().size<ants[i].size){
							st.pop();
					}
					if(st.empty()||!(st.top().dir==1&&st.top().size>ants[i].size)){
						st.push(ants[i]);
					}
				}
				else st.push(ants[i]);
			}

		}
		int cnt=0;
		while(!st.empty()){
			cnt++;
			st.pop();
		}
		cout<<cnt<<endl;
	}
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值