DLNU weekly(May 18,2013)解题报告

找到了草稿箱里,我大学写的博客,但是我发现已经看不懂了,大坑。自从工作后,我已经好长时间没有A题了。依稀记得我大学寝室的标语是 ,“今天你AC了吗?”。看到“川神兽”,“樊大神” 这两个熟悉的外号的,还是会心一笑啊,回想当时,特别的快乐,天天刷题刷排名,争取最短时间,最少代码。现在已经老了,世事无常啊。

我当初就有强迫症,想写一个完美的博客,想把三个思路都给写了,但是思路二可能有点在我脑子里,但是说不明白的地方,想好好整理一下,结果拖着拖着就黄了。我现在是一点都想不起来了,既然是我的脑力成果,虽然只写了一半,但还是发了吧,不然太浪费我当初的脑细胞。

 

大连民族学院ACM/ICPC/练习

 

D1137:坠落的蚂蚁

 

总时间限制:

1000ms

内存限制:

65536kB

描述

一根长度为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!”

样例输入

4
10 1
90 0
95 -1
98 -1

样例输出

98

           

 

             结题思路:      这道题我总共知道了三个思路,最开始我曾想过直接模拟,但是当时感觉好像会超时。这时想到了,原先曾经做过这道题,那时百度的一个思路说是两只相碰蚂蚁相当于直接穿过,这个想法据说在《编程之美》叫做“灵魂算法”。我当时只想起了这个。幸好川神兽又延时30分钟,绞尽脑汁的才想清楚了具体的思路通过那句话,终于AC了这道题在比赛结束前。这是我知道的第一个思路。结束比赛后我曾经尝试直接模拟,发现也是可以AC的,说明不会超时,但是这是有些小技巧的,还有两个小分支。这是我知道的第二种思路。但是尽量不要选择直接模拟,因为很可能会超时的。第二天,也就是今天,我们聚会,对周赛就行讨论,我通过樊大神的讲解,我了解了第三种思路,但是这种思路写出的代码和第一种相同,说明是第一种思路的变形。

                        总结来说这道题总共有两个思路,每个思路又有两个分支。一个是对同一个代码的不同解释,另一个是对同一个思路的不同解决。而思路概况来说就是模拟加分析。下面具体讲解一下每种思路和代码。

 

             思路一 :直接模拟法,这里有几个小问题:

                           一是什么时候结束模拟,不能一直模拟下去,那样会超时的。这有两种方法:

                                      一是记录掉落的蚂蚁数量,如果A蚂蚁掉落,或者掉落的蚂蚁数量等于N-1,也就是除了A,别的蚂蚁都掉落,结束模拟,输出时间,或者是"Cannot fall!";

                                      二是通过时间判断,因为根据“灵魂算法”最长的时间,就是一只蚂蚁从一头到另一头的时间,即100,所以如果时间time等于100了就结束模拟,判断A掉落没,输出时间,或者是"Cannot fall!"。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值