题目描述
众所周知,蚂蚁是一种十分神奇的生物,在算法设计中,我们往往能从它身上得到启发,例如在求解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;
}
}