注意到:除A以外的蚂蚁是没有身份,一视同仁的

如果没有任何身份,两只不同速度的蚂蚁相遇,会发生什么?

在逻辑上,他们交换了速度,或者交换了身份。在视觉上,没有变化!

因此,本题看似是复杂的模拟系统,实际上,时间存在上界, 100。

假设有一只蚂蚁从1cm开始向右移动,那么,永远有一只蚂蚁(无论是谁),需要继承它的意志,向右移动,直至100cm,然后掉下去。

考虑最简单的情况:总共3只蚂蚁,A和它的一左一右,往中间挤。可以发现,与左右蚂蚁的位置无关,A永远不会掉下去,会在启动后,折返会原位,然后定住。

因此,找A左右初始速度向内的蚂蚁个数即可, 它们提供了原动力, 以及最终掉下去的时间。

#include <stdio.h>
#include <stdlib.h>

void cpy(int a[], int b[], int n){
    for(int i=0; i<n; ++i) a[i]=b[i];
}

int __Qsort(int lis[][2], int n, int tag){
    //一趟快排
    int tmp[2], l=0, r=n;
    cpy(tmp, lis[tag], 2);
    cpy(lis[tag], lis[l], 2);
    while(l<r){
        while(l<r&&lis[r][0]>=tmp[0]) r--;
        cpy(lis[l], lis[r], 2);
        while(l<r&&lis[l][0]<=tmp[0]) l++;
        cpy(lis[r], lis[l], 2);
    }
    cpy(lis[l], tmp, 2);
    return l;
}

void Qsort(int lis[][2], int len){
    if(len<2) return;
    int m=__Qsort(lis, len-1, 0);
    Qsort(lis, m);
    Qsort(lis+m+1, len-m-1);
}

int main() {
    int n, i, tag, info[101][2];
    while (scanf("%d", &n) != EOF && n) {
            for(i=0; i<n; ++i){
                scanf("%d %d", &info[i][0], &info[i][1]);
                if(info[i][1]==0) tag=i;
            }

            //一次快排, 并标记
            tag = __Qsort(info, n-1, tag);
            Qsort(info, tag);
            Qsort(info+tag+1, n-tag-1);

            //flag是一个2位二进制编码, 0:不会坠落, 1:向左坠落, 2:向右坠落, 3:还未知
            int l=tag-1, r=tag+1, fin, flag=3;
            while(flag==3){
                flag=0;
                while(r<n&&info[r][1]==1) r++;
                if(r<n) {fin=r++; flag+=1;}
                while(-1<l&&info[l][1]==-1) l--;
                if(-1<l) {fin=l--; flag+=2;}
            }
            if(!flag) printf("Cannot fall!\n");
            else printf("%d\n", 100*(flag-1) + (3-2*flag)*info[fin][0]);

    }
    return 0;
}