题目描述
一根长度为1米的木棒上有若干只蚂蚁在爬动。它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右。如果两只蚂蚁碰头,则它们立即交换速度并继续爬动。三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止。如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去。在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动。给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间。
输入
第一行包含一个整数表示蚂蚁的个数N(2<=N<=99),之后共有N行,每一行描述一只蚂蚁的初始状态。每个初始状态由两个整数组成,中间用空格隔开,第一个数字表示初始位置厘米数P(1<=P<=99),第二个数字表示初始方向,-1表示向左,1表示向右,0表示静止。
输出
蚂蚁A从开始到坠落的时间。若不会坠落,输出“Cannot fall!”
样例输入
2 44 0 41 1 2 13 0 63 1 4 56 0 64 -1 85 -1 47 1
样例输出
59 Cannot fall! 85
#include <bits/stdc++.h>
using namespace std;
struct haha{
int a;
int c;
}we[110];
int b[100];
bool cmp(haha a,haha b){
return a.a<b.a;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int f=0,x1=0,x2=0,d;
memset(b,0,sizeof(b));
for(int i=0;i<n;i++){
scanf("%d %d",&we[i].a,&we[i].c);
}
sort(we,we+n,cmp);
for(int i=0;i<n;i++){
if(we[i].c==0){
f=1;
d=i;
}
else if(f==0){
if(we[i].c>0){
//printf("%d*\n",i);
x1++;
b[i]=1;
}
}
else if(f==1){
if(we[i].c<0){
x2++;
b[i]=1;
}
}
}
//printf("%d*%d\n",x1,x2);
if(x1==x2){
printf("Cannot fall!\n");
}
else{
if(x1>x2){
int s=x2+1;
//printf("%d*%d\n",s,d);
for(int i=d;i>=0;i--){
// printf("gg%d*%d\n",s,b[i]);
if(b[i]==1 && s!=0){
s--;
}
if(s==0 && b[i]==1){
printf("%d\n",100-we[i].a);
break;
}
}
}
else{
int s=x1+1;
for(int i=d;i<=100;i++){
if(b[i]==1 && s!=0){
s--;
}
if(s==0 && b[i]){
printf("%d\n",we[i].a);
break;
}
}
}
}
}
return 0;
}