模拟思维
详细思路参考高赞题解,图片一目了然
要点:
- 两只蚂蚁碰头可理解为互不干扰,各走各的
- 左边向左的、右边向右的蚂蚁对A没有影响
- 左边向右的、右边向左的蚂蚁可以两两抵消
- 最终取决于抵消后,最靠近A的蚂蚁的运动时间
- 代码思路:按位置排序、找到A的下标,分别统计左边向右、右边向左蚂蚁、输出
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100;
struct ant{//蚂蚁
int pos;//位置
int direction;//速度方向
ant(int p,int d):pos(p),direction(d){}
ant(){}
bool operator < (ant x) const {//按位置(从左往右升序)
return pos<x.pos;
}
};
ant s[maxn];//输入
ant Left[maxn];//左边向右的蚂蚁
ant Right[maxn];//右边向左的蚂蚁
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
int p,d;
scanf("%d%d",&p,&d);
s[i]=ant(p,d);
}
sort(s,s+n);//排序
int indexA;
for(int i=0;i<n;i++){//找A的下标
if(s[i].direction==0){
indexA=i;
break;
}
}
int indexleft=0;
for(int j=0;j<indexA;j++){//A左边的
if(s[j].direction==1)Left[indexleft++]=s[j];//向右跑的
}
int indexright=0;
for(int j=indexA+1;j<n;j++){//A右边的
if(s[j].direction==-1)Right[indexright++]=s[j];//向左跑的
}
int ans=0;//取决于左右两两抵消后,最靠近A的蚂蚁的运动时间
if(indexleft>indexright) ans=100-Left[indexleft-indexright-1].pos;
else if(indexleft<indexright) ans=Right[indexleft].pos;
if(ans==0)printf("Cannot fall!\n");
else printf("%d\n",ans);
}
return 0;
}