TopCoder SRM289 DIV2 Report

TopCoder SRM289 DIV2 Report

match date:Tuesday, February 14, 2006
report date:Friday, February 17, 2006

Preface:
    好也!在DIV2 拿了第一,虽然DIV2难度比较低,但是也算有小突破了。可惜的是因为加分实在太少,所以还是只能以1180分继续在DIV2打拼。
    DIV2的情况是有两位新人拔得头冠。第一题成功率很高;第二题提交率高,成功率也不低;第三题少提交。
    下一次的SRM我要上课,所以不能参加了。等到22日有一次带奖金的SRM,如果校园网能恢复的话,我一定要去参加!
   
Problem 300 - ObjectFall :
    很简单的模拟题。先搞输入,然后按y轴排序,接着模拟一下物体下落。模拟其实只要判断在经过一个障碍后的x是否在下一个障碍内,在则time+=5 ,否则无操作。最后返回time+y。

Problem 500- FallingBall:
    花了点时间看懂题,不过还是顺利得解决掉了。这题的模型是杨辉三角(外文Pascal's triangle)。赛后分析中有说到为什么数据不会溢出,简单说明一下:Pascal's triangle :
            an,r=(n!)/(r!(n-r)!)=(n;r) (为了避免用公式编辑器,(n;r)是n中取r的组合,        也许高中前的教材中用的是C(r,n),总之这只是习惯的不同,不影响概念理解吧。)

    所以单独一行的和是: ∑ j=[1,n](i:j) = 2^i ,而我们所会计算到的最大值为30行,即2^29。关于大数值Pascal's triangle 的问题,可以试试uva485。
    杨辉三角大家都知道,直观理解是 an,r = an-1,r-1+an-1,r     a0,0=1
了解了上面这个式子,其实就是知道了DP方程,然后就可以很容易的递推出一个三角了吧。
    但是,这题还有一个小弯,就是它要求小球必须通过指定袋子,通不过则不算有路。其实解决方式有二:
        其一如赛后分析一样,预先准备杨辉三角,然后对每一次小球从袋子往下落看作一个杨辉三角,这样就能求得任意两个袋口间小球的路径数量,然后用乘法原理就可以得到解了。
        其二是动态生成该题解,DP方程还是杨辉三角的,只是当小球落到了有袋子的行时,除袋子位置,其他位置值改为0。然后从袋子处开始DP下去。到了最后一行把底部的解相加就行了。

Problem 1000- GreenWave:
    这是一道比较复杂的模拟题目。首先需要对模拟的规模进行估计,如果模拟方式不好,很容易超时,而如果模拟手段太多,则输入代码的时间就会很长。
    题目的大意是模拟交通上的汽车与路灯,注意规模是道路长1-500,汽车数量0-10,灯的数目为0-5。由于灯的数量很小且duration值为1-5,所以我们可以枚举5*5种结果,然后做模拟。
    要产生5*5个结果当然可以来5个for循环,不过这样的代码也未免太不雅观了,用下面的递归函数是一种比较优雅的方式。

        // 产生下一个duration
        boolean next ( int[] dur , int i ){
                if ( i<0 ) return false;        //     循环到顶了,无下一个duration
                if (dur[i]==5 ){            //    i位置到5,进位给i-1位置
                    dur[i]=1;
                    return next( dur , i-1 );
                }else{
                    dur[i]++;
                    return true;
                }
            }

在有了25个解之后,我们变可以开始模拟了,大致流程如下:
    ① 初始化所有的汽车起始位置为-1,表示车还未进入马路。
    ② 从未跑完马路的车辆中取出第i辆(初始i=1)
    ③ 如果车i还未进入马路,判断是否可以进入马路,可以则进入0位置,否则不动。跳②
    ④ 如果车i已进入马路,先计算其最大可行路程,并将最大可行路程与i-1车位置比较,并调整车的可行路程。
    ⑤ 对每个灯判断一下,可行路程中是否存在红灯,灯j的状态计算公式为:t为当前时间
           ( t - duration[k] + 10 )%10 )>4  true-红 false-绿
    ⑥ 若存在红灯,则调整。循环⑤⑥步,直至每个灯都检查过了。然后继续。
    ⑦ 判断可行路程是否已经通过了整条马路,是则将车算如跑完马路的车,否则更新该车的当前位置。
    ⑧ 判断i是否是最后一辆未跑完马路的车,不是则i++ 跳②,是则t++。
    ⑨ 判断是否还有未跑完的车,有则i=1,跳②,无则返回t。

最后,比较出最小的t (时间),然后输出对应的解即可。

Links:

My statistic:
    http://www.topcoder.com/stat?c=coder_room_stats&cr=20862220&rd=9810&rm=247627
   
SRM 289 - Problem Set & Analysis ('s' in Static should be capitalized):
    http://www.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm289

Pascal's triangle ('P' and 'T' in PascalsTriangle should be captialized):
    http://mathworld.wolfram.com/PascalsTriangle.html

UVA 485:
    http://acm.uva.es/p/v4/485.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值