模拟思维

详细思路参考高赞题解,图片一目了然

要点:

  • 两只蚂蚁碰头可理解为互不干扰,各走各的
  • 左边向左的、右边向右的蚂蚁对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;
}