F. 蚂蚁
Time limit per test: 0.5 seconds
Time limit all tests: 5.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 112 / 336
水平线上有 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
5 4 0 3 1 2 0 1 0 5 0
2
题目出处:「游族杯」上海市高校程序设计邀请赛暨华东师范大学第九届 ECNU Coder 程序设计竞赛 (重现)
思路:这个题目刚开始没理解意思。后来看了看 用栈就可以做了。首先栈为空什么都不用管,直接进栈。然后栈里的标志如果是1就跟下一个判断如果方向相同就进栈。如果不同就比较大小如果后面进来的数据大,就出栈,继续与他的下一个比较直到栈为空或者方向相同了。
下面看代码吧
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;
typedef struct mayi
{
int w;
int flag;
}mayi;
int main()
{
int n;
mayi zhandin;
while(scanf("%d",&n)!=EOF)
{ stack<mayi>mys;
for(int i=1;i<=n;i++)
{
int x,flag;
scanf("%d%d",&x,&flag);
if(mys.empty()) {mayi a={x,flag}; mys.push(a);}//开始啥都不管直接进去。
else
{
zhandin=mys.top();
if(zhandin.flag==0) {mayi b={x,flag};mys.push(b);}//方向为0不用管直接进
else//方向为零为1
{
if(flag==0)//进来的那个数据的方向与现在这个相反
{
while(zhandin.w<x&&flag!=zhandin.flag&&!mys.empty())//判断哪个大,大就出栈,小就不用管
{
mys.pop();
if(!mys.empty()) zhandin=mys.top();
}
if(mys.empty()||zhandin.flag==flag)//栈为空蚂蚁都被进来的那个蚂蚁吃掉了。
{ mayi c={x,flag};
mys.push(c);
}
}
else//进来的那个数据与栈顶数据相同 直接进。
{
mayi d={x,flag};
mys.push(d);
}
}
}
}
printf("%d\n",mys.size());
}
}