第一行包含一个整数表示蚂蚁的个数N(2<=N<=99),之后共有N行,每一行描述一只蚂蚁的初始状态。每个初始状态由两个整数组成,中间用空格隔开,第一个数字表示初始位置厘米数P(1<=P<=99),第二个数字表示初始方向,-1表示向左,1表示向右,0表示静止。

输出描述:

蚂蚁A从开始到坠落的时间。若不会坠落,输出“Cannot fall!”


思路分析

首先我们需要明确一点, 性质一:A蚂蚁经过偶数次碰头后速度为0 \color{red}\textbf{性质一:A蚂蚁经过偶数次碰头后速度为0} 性质一:A蚂蚁经过偶数次碰头后速度为00次碰撞时,其速度本身就为0,2次碰撞是什么情况呢?


经过两次碰撞之后,A会再次装上右侧的速度为0的蚂蚁,他的速度又回到0,永远走不出去。


从上面图中我们可以看到,我们只考虑了A的左侧向右走的蚂蚁,和A的右侧向左走的蚂蚁,那么还有两类左侧向左走,右侧向右走,他们对A有影响吗?

性质二:左侧向左,右侧向右的蚂蚁对结果无影响 \color{red}\textbf{性质二:左侧向左,右侧向右的蚂蚁对结果无影响} 性质二:左侧向左,右侧向右的蚂蚁对结果无影响
考虑下面左图和右图,左图中A左侧有一个向左的蚂蚁和一个向右的蚂蚁,二者相碰时则交换速度,此时对A而言,相当于右图中我们只有一个向右的蚂蚁的场景,同理,右侧向右的蚂蚁对A也是没有影响的。这也就是为什么,我们可以将蚂蚁看作可以互相穿过,而不是碰撞掉头。


到这里,我们已经找到了蚂蚁不能坠落的条件,也知道了影响A的个体,因此我们可以使用两个数组 l , r l,r l,r分别存储A的左侧向右的蚂蚁和A的右侧向左的蚂蚁,然后再来讨论他们是如何影响A的结果的(以下都假设l,r包含蚂蚁的数目各不相等),我们不妨从最简单的情况开始推导:


上面三种情况基本上包含了所有的不想等的情况,我们依次来讨论一下

  1. 对于第一种情况,显然A需要的时间是 x 1 x_1 x1​。
  2. 对于第二种情况, x 2 x_2 x2​在 x 1 x_1 x1​后面,而右侧不会将A变向,所以答案仍然是 x 1 x_1 x1​。
  3. 对于第三种情况,A先和 x 0 x_0 x0​碰撞,再和 x 1 x_1 x1​碰撞,此时他的速度为0,因为我们看作蚂蚁可以互相穿过所以他最后总会和 x 2 x_2 x2​碰撞,因此答案是 x 2 x_2 x2​(还是画图吧)


我们发现右侧有两个,左侧有一个的时候,决定因素在于右侧的第二个,因为左右侧相同数目的蚂蚁互相抵消,他们的碰撞使得A的速度最终为0,而打破僵局的那个蚂蚁,就是第一个左右侧数目不对等的蚂蚁。(左3右4那就是右面第四个,左3右1那就是左面第二个)

struct P {ll pos, v;
}a[MAX];bool cmp(P p1, P p2) { return p1.pos < p2.pos; }int main() {ll n, s;while (cin >> n) {vector<P> vl, vr;for (int i = 0; i < n; i++) {cin >> a[i].pos >> a[i].v;if (a[i].v == 0)s = i;}for (int i = 0; i < n; i++) {if (a[i].pos < a[s].pos&&a[i].v>0)vl.push_back(a[i]);else if (a[i].pos > a[s].pos&&a[i].v < 0)vr.push_back(a[i]);}ll l1 = vl.size(), l2 = vr.size();sort(vl.begin(), vl.end(), cmp); sort(vr.begin(), vr.end(), cmp);if (l1 == l2)printf("Cannot fall!\n");else if (l1 > l2) cout << 100 - vl[l1 - l2 - 1].pos << endl;//99还没掉下去else cout << vr[l1].pos << endl;}
}

坠落的蚂蚁【思维/模拟】相关推荐

  1. 题目1159:坠落的蚂蚁

    题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度, ...

  2. CF--思维练习--CodeForces - 216C - Hiring Staff (思维+模拟)

    ACM思维题训练集合 A new Berland businessman Vitaly is going to open a household appliances' store. All he's ...

  3. 蓝桥杯 兰顿蚂蚁【模拟】

    题目链接 解题思路 这就是一道纯模拟题,主要就是根据题意写出蚂蚁在白格和黑格中不同的变化方式即可. 代码部分 #include <iostream> #include <stdio. ...

  4. LQ0213 兰顿蚂蚁【模拟】

    题目来源:蓝桥杯2014初赛 Java A组H题 题目描述 兰顿蚂蚁,是于 1986 年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只& ...

  5. 蓝桥杯-兰顿蚂蚁 (模拟)

    题目大意:根据题中所规定的方法,求出一定步数后,蚂蚁的位置 题目分析:本题属于常规的模拟题,就是只要根据题意把蚂蚁每步的移动方向,改变方格的颜色模拟出来即可. 我是将四个方向用整数表示,便于后期左转和 ...

  6. 蓝桥杯.蚂蚁感冒(模拟)

    Question: Solve: 当想不到办法的时候,暴力模拟就是最好的办法~ 既然是要走杆,那就一步一步走,一步一步的判断,等蚂蚁全部出界之后再统计一下有多少感染就行,这个思路非常平易近人 接下来明 ...

  7. 蓝桥杯 兰顿蚂蚁(模拟)

    历届试题 兰顿蚂蚁   时间限制:1.0s   内存限制:256.0MB 问题描写叙述 兰顿蚂蚁.是于1986年,由克里斯·兰顿提出来的,属于细胞自己主动机的一种. 平面上的正方形格子被填上黑色或白色 ...

  8. CodeForces - 820D Mister B and PR Shifts(思维+模拟)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列 p,可以执行数次循环右移的操作,问的最小值是多少 题目分析:暴力的话用 n * n 很容易实现 ,但数据是 1e6 的,显然又不能用暴力去写, ...

  9. Gym - 101972H Beautiful Substrings(思维+模拟)

    题目链接:点击查看 题目大意:题目的意思挺难理解的..尤其是对我这种英语渣来说,简单说一下,就是先给出三个数字n,m,k,然后再给出两个字符串a和b,n和m代表的是字符串a和b的长度,然后描述题意: ...

最新文章

  1. Ubuntu18.04 显卡驱动安装
  2. 创新实训个人记录:approximation factor, maximum matchingvertex cover
  3. 机器学习物语(2):大数定理军团
  4. alibaba实习生代码大赛
  5. ubuntu下如何查看用户登录及系统授权相关信息【转】
  6. 网页现现实理服务器没有响应,前端_网页编程 HTTP协议(进阶)
  7. 零基础学习.NET平台和Csharp编程开发
  8. python界面颜色设置_pycharm修改界面主题颜色的方法
  9. 担心5G用不起?提速降费不是说说而已
  10. python中比较重要的几个函数_python几个重要的内置函数
  11. c语言程序调试方法有哪些,c语言程序的调试方法有哪些
  12. 了解单反相机的自动对焦点
  13. 计算机软件著作权登记
  14. 魏德米勒端子eplan宏_魏德米勒端子选型图册(完全版).pdf
  15. 虚拟偶像成为二次元香饽饽,从直播切入有戏吗?
  16. vue 时间方法(yyyy-mmmm-dddd hh:mm:ss)
  17. 字体反爬-汽车之家论坛
  18. 趣闻-如何下载知乎视频
  19. nltk词性标注与词形还原中的词性类型匹配
  20. STC89C52RC - 11 - 蜂鸣器BEEP

热门文章

  1. 29岁了还一事无成是人生的常态?
  2. JavaScript三种注释写法
  3. iOS 获取当前的UIViewController
  4. 网络视频无法快进无法选中进度条
  5. 蓝牙学习之①:调戏小米手环
  6. 辞职后五险一金怎么办?史上最全处理办法汇总-千氪
  7. PWmat案例赏析:利用激光脉冲实现绝缘体-金属超快转变
  8. matlab产生光脉冲,【资源】分享一个脉冲的光线中传输的matlab程序 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  9. word使用技巧-批量删除图片技巧
  10. python余弦定理_余弦定理与文本相似度