TOJ 2006 Weekly Contest 1 报告

TOJ 2006 Weekly Contest 1 报告

Preface: 

    嘿嘿、感觉好爽呀,做了5道题目,拿了个第7(算是银牌?呵呵)。先是我去拉人一起来做,结果没一个人理我-_-0 ,后来我自己搞,搞了3道,肖叉进来陪我一起做,把最后两道解决了。
    整体上难度不高,没有特别神奇的算法和技巧出现。训练一下满好的。


A.   Magic Sticks Again

    第四个过的,原本我在考虑是贪心还是动规,后来肖叉过来陪我一起做,初步分析后得出结论是贪心。具体算法是:对Stick(a<b,a为左端,b为右端,注意大小)按a排序,然后准备一个链表,维护多段由许多Stick连接出的最终结果段的链表,对于每个Stick的以下两种情况做处理:
    1   Stick左端大于等于链表中某段的右端,将该Stick粘上。
    2   Stick无法粘到任何一段上,则Stick自己作为一段。

    问题是在最糟情况下,情况1的判断会浪费许多宝贵时间,比如:
         1-100 2-100 3-100 ... 99-100
    导致情况1的比较次数达N,再乘以N个Stick次循环,复杂度是O(n^2),致使超时。

    解决方案是,采用堆(或优先队列)维护链表。由于已经对Stick排好序,所以某Stick的a值小于等于下一个Stick的值,那么可以直接考虑将该 Stick粘在堆中b值最小的段上。再抽象一点,我们所要维护的其实就是一个段的b值,因为以后出现的Stick不可能会有b 值小于等于某段a值的情况,也就无须考虑某段的a 值了。
    也就是说,做一个int的堆,每循环一个Stick就添加或更新其中的一个b,对于情况1的判断就是判断堆顶的b是否小于等于Stick的a。


B.   Number Sequence again

    貌似是道复杂的数学题,但在肖叉聪明的脑袋瓜里转了一圈就出规律的,佩服啊!以T0=5/8为例子,进行以下操作:
        T0=5/8    =    0    T1=1/(5/8 - 0)
        T1=8/5    =    1    T2=1/(8/5 - 1)
        T2=5/3    =    1    T3=1/(5/3 - 1)
        T3=3/2    =    1    T4=1/(3/2 - 1)
        T4=2/1    =    2
    从这里可以看出些许的规律来了,仔细分析一下,每个有理数都是由整数+小数所得,整数部分只要求商就可以了,而小数部分按题意,可以求倒又得到了一个类似的有理数字,如此递归。。。
    
    对于出现整除的结果时,为了保证最后的一个解是1,所以前一个的解可以是商-1。
    然后,考虑负数,比如 -4/5,可以看承-1+1/5,也就是说不同与 4/5的T0= 0 + 1/(5/4),这里处理为T0= -1 + 1/(5/1),就保证了所有的an(除a0)都为正了(不等于0是由算法本身的性质所决定的,如果出现0说明算法实现有问题)。
    
    
C.   Qiushi Bookstore Again

    是我上手第一道解决的问题,题目描述的是进行了一半的Kruskal算法,只要抓住两点:对边排序和并查集,很快就可以解决掉。



D.   Special Judge Again

    有意思的题目,是对以前的一道题做一个Special Judge,对于M,只要求C(n,2)也就是n*(n-1)/2就行了。而对于项链,for一下,对一个二维布尔数组(i,j表示颜色i与颜色j是否有相邻)维护。最后遍历数组,如果有没出现的颜色相邻情况,就是WA,否则AC。



E.   Checker Game

    这道题,我起初使用了深搜的方法,结果惨遭TLE,本来以为剪下支就行,不过还是没能挺过去。

    其实这是一道DP题,用备忘录的数组记录从顶端到i行j列的最大值。动态方程:

    dp [i] [j] = max( dp[i][j-1], dp[i][j], dp[i][j+1] ) + value[i][j]   初始i=0时,dp对应value,同时要保证i和j不越界,越界就不用算了。

    最后遍历最后一行得出max值。


Links:

TJU 2006 Weekly Contest 1:
        http://cs.tju.edu.cn/acm/contest/contest.php?cid=27
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值