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

京公网安备 11010502036488号