注意到:除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;
}

京公网安备 11010502036488号