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; }