牛客网——坠落的蚂蚁(偏难
我之前看过《挑战程序设计》这本书,我记得书上的算法好像更精简一些,下面是题目,和别人的解答(我有去自行理解
题目描述
一根长度为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!”
链接:https://www.nowcoder.com/questionTerminal/fdd6698014c340178a8b1f28ea5fadf8 来源:牛客网 #include<cstdio> #include<vector> #include<algorithm> using namespace std; struct Ant { int position; int direct; //方向 bool operator < (const Ant &a) const { return position<a.position; } }; int main() { int n; while(scanf("%d",&n) != EOF) { vector<Ant> ant(n); for(int i = 0; i<n; i++) scanf("%d %d",&ant[i].position,&ant[i].direct); sort(ant.begin(),ant.end()); //////接下来要做的就是找到静止的那只的位置,为此我们要先排序 //这样找到的静止的蚂蚁左边有几只就出来了 int target,toLeft = 0; //这里选用向左走的为基准来做 for(int i = 0; i<n; i++) //遍历所有蚂蚁 { if(ant[i].direct == 0) target = i; if(ant[i].direct == -1) toLeft++; }//现在的target就是静止的蚂蚁左边的数量了 bool flag = false; int ans; if(toLeft == target) flag = true; else if (toLeft > target)//这样的话我们要找的就是所有向左走的蚂蚁中,第target蚂蚁 { int cnt = 0;//计数器 for(int i = 0; i<n; i++) { if(ant[i].direct == -1 && cnt == target) { ans = ant[i].position; break; } else if(ant[i].direct == -1) cnt++; } } else //向左走的蚂蚁少,那么目标蚂蚁会向右落下 { int cnt = 0; for(int i = n - 1; i>=0; i--) { if(ant[i].direct == 1 && cnt == n - target - 1)//相应的变化,cnt要变成静止蚂蚁右边的蚂蚁数量 { ans = 100 - ant[i].position; break; } else if(ant[i].direct == 1) cnt++; } } if(flag) printf("Cannot fall!\n"); else printf("%d\n",ans); }//while return 0; }//main