1.蚂蚁之间不能互相穿过,因此各个蚂蚁的相对位置不变。
2.各个蚂蚁除了速度和位置,其余是无差别的,因此两个蚂蚁相撞可以等效为这两个蚂蚁互相穿过,并交换无差别的“躯壳”。
3.可以假设各个蚂蚁相互独立,不会相撞,可以分别得出每个蚂蚁坠落的时间和方向。
4.每当有一个蚂蚁从左边坠落,相当于A蚂蚁左边少了一只蚂蚁。(右边同理)
5.当某一边的蚂蚁已经为0无法减少后,A蚂蚁就会代替本该坠落的蚂蚁而坠落。
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
    int N,number,A_pos,i,time;
    int antsinformation[4][99];//记录蚂蚁的信息,位置,速度,距离其自己终点的距离,是否已经坠落(0为坠落,1为未坠落)
    int pos,veloc,min,minpos;//位置,速度,最先落下的蚂蚁
    int leftnum,rightnum;//以A蚂蚁为分隔,记录左右两边蚂蚁数量
    scanf("%d\n",&N);
    number=N;
    i=leftnum=rightnum=0;
    while(number--){
        scanf("%d%d\n",&pos,&veloc);
        antsinformation[0][i]=pos;
        antsinformation[1][i]=veloc;
        if(veloc==1){
            antsinformation[2][i]=100-pos;
        }
        else if(veloc==-1){
            antsinformation[2][i]=pos;
        }
        else{
            antsinformation[2][i]=0;
            A_pos=pos;   //A蚂蚁的位置,为了确定左右两边蚂蚁数量
        }
        antsinformation[3][i]=1;
        ++i;
    }
    for(int i=0;i<N;++i){//统计A蚂蚁左右两边蚂蚁的数量
        if(antsinformation[1][i]!=0){
            if(antsinformation[0][i]>A_pos){
                ++rightnum;
            }
            else{
                ++leftnum;
            }
        }
    }
    while(leftnum>0||rightnum>0){
        min=100;
        minpos=0;
        for(int i=0;i<N;i++){
            if(antsinformation[1][i]!=0&&antsinformation[3][i]!=0&&antsinformation[2][i]<min){//得到距离终点最近,本次应该坠落的蚂蚁
                 min=antsinformation[2][i];
                 minpos=i;//本次坠落的蚂蚁的相对位置
              }
        }
        antsinformation[3][minpos]=0;//蚂蚁坠落
        if(antsinformation[1][minpos]==1){//在右边坠落
            --rightnum;
        }
        if(antsinformation[1][minpos]==-1){//在左边坠落
            --leftnum;
        }
        if(rightnum<0||leftnum<0){//A蚂蚁坠落
            break;
        }
    }
    if(rightnum<0||leftnum<0){
        time=antsinformation[2][minpos];
        cout<<time<<endl;
    }
    else{//此时leftnum=rigthnum=0,A蚂蚁不会坠落
        cout<<"Cannot fall!"<<endl;
    }
	return 0;
}