2012年浙大7月月赛总结 (Zoj Monthly July 2012)

     本次月赛由我、DTen和sssplk完成,三台机子同时进行。

     本次比赛的题目说不上特别好,因为就四种题型:数学、贪心、DP、图论,最后一题和G题有用到线段树,其他的内容似乎都没提及,不够综合,这也导致我从头敲到尾,两位可怜的队友成了翻译,从头看题看到尾。另外这场比赛被好几个神牛AK,原来AK如此简单,这也是我觉得题目不够好的原因,我想应该是Watashi不在,没出神题卡AK.

      本场比赛我们迟到了半小时,吃饭吃太久了。我们队共敲出5题,一题水题,4题DP,没看剩下的题还真以为是DP专场。其实这场比赛发挥得挺不好,赛后发现好几题都是简单题,比赛的时候要么是没出这没话说,要么是根本没看题,后者主要是因为剩下的题过的人不多,觉得会较难,空费看题时间。只出5题还有一个原因是我敲得比较慢,没办法快准狠地A题,路漫漫其修远兮,吾将继续刷题而求索...

     

     到现在我共A了10道题,剩一题比较复杂的DP没深入想--留给明天的礼物。现在说下这场比赛的题目(前面数字是题目在Zoj上的题号):

       3622、Magic Number  水题。把y补到任意一个数的右边看补成的数能否被y整数。假设前面那个数是1,那么数就是1y,如果1y能被y整除,那么2y也能被y整除,那么直接判断1y能否被y整除,这个数并不多,到20忆似乎只有40来个,打个表直接判断区间内的个数。

      3623、Battle Ships  DP,用最少的时间建塔打大Boss。比赛时我是乱搞过的,用dp[i][j]表示能量为i的时候打Bossj血的最少时间,dp[i+power[k]][j+i*time[k]] = max{dp[i+power[k]][j+i*time[k]],dp[i][j]+time[k]},表示建完某座塔打Boss j+i*time[k]的最少时间,为什么有个+i*time[k],因为建塔的时候已经建的塔同样可以攻击Boss。赛后想了下,应该有更简单的方法,不然比赛时不会过那么多。额,也确实用更简单的方法过掉了这题,共有n种塔可供选择,相当于n个物品,时间相当于容量,打Boss多少血相当于价值,那么本题就是一个简单的完全背包,本题数据恨水,怎么写怎么过..

     3624、Count Path Pair  组合数学题。给定四个点A、B、C、D,有几个约束条件很重要,A在BCD左边,B在CD左下方,C在D左下方,D在ACB的右上方,求A到D点、B到C点路径不相交的方案数。走时必须正向平行于坐标轴,也就是只能往右或者往上走。那么本题就相当于A到D点的路径数*B到C点的路径数-他们相交的路径数,本题难点就在求B到C点的路径数,能想到这题就成水题了,其实就是A到C点的路径数*B到D点路径数,因为这两个路径必定相交。最后求( C(m + n, n) * C(m + q - p, q) - C(m + q, q) * C(n + m - p, n)) % 100000007即可。

     3625、Geek's Collection  出题者似乎在秀英文水平,前后长长的两段让无数人止步,后面简短的两段才是重点。标准的数学题,比赛时没看赛后YY了一下,当a为1的时候,Special Number总和为1,a为2的时候是3,a为3的时候是7,a为4的时候是15,怎让人不yy,前面那个长长的式子不就是大一当年高数老师常常和我们讲的关于收敛不收敛的例子,查百度后发现那个常数是0.57721566490153286060651209。最后结果就是(pow(2,a)-1) * 0.57721566490153286060651209.    

     3626、Treasure Hunt I  树形DP.给定n个点的一棵树,点有点权,边有边权,要求从某点出发,再回到原点能获得的最多点权,走过的边权不能超过Limit。很水的树形背包,dp[i][j]表示以i点为根又回到i点走过的边权为j时获得的最多点权。dp[i][j] = max{dp[i][j],dp[i][j-k-2*len]+dp[son][k] },son是i的儿子,len表示边权。


     3627、Treasure Hunt II 贪心题。因为每个点的黄金只能走一次,而且有有时间、距离限制,那么一开始的时候肯定可以一起往两边跑,看到黄金就抢,直到超过距离或者时间不够或者到边界不能跑为止。这时候是双核,这样跑肯定最优。然后开始要么往左边一直跑,右边的跟着一直跑,遇到左边界就往右跑,要么就往右边一直跑,左边的跟着一直跑,遇到右边界就往左跑。如此这般就过掉了这题。

    3628、Treasure Hunt  没做,攒题加RP。

    3629、Treasure Hunt IV 数学题。如果某个n符合[n/1] + [n/2] + ... + [n/k] + ... +[n/n]为偶数就称为保藏数,求某个区间内的保藏数个数。这题是sssplk和DTen联合想的,赛后17分钟ac,咳,纯爷们,午饭就不该慢慢品尝。写几个数发现保藏数是扎堆存在的,个数为1,5,9,13,17,加起来发现就是C(x,2),那这个x怎么确定呢,又发现每堆保藏堆都是从偶数的平方开始的,如果0,4,16.结合起来得到2平方之前的个数为1,4平方之前的个数为6,6平方之前的个数为15,这些个偶数就是传说中的那个x。然后呢,然后对给定的[a,b]分别统计并相减,统计b的时候对b开方,然后下取整到最近的偶数,然后判断是在那个偶数开始的一堆保藏数里,还是靠后的位置,然后呢?然后就没有然后了。

    3630、Information 其实我觉得这题是除第一题外最水的一题,都不需要怎么想套套模板就ac了。枚举每个点并删除之,然后来个飘逸的Tarjan,求出最大的那个重联通块。取所有重联通块的最小值即可。无Trick,很暴力,复杂度O(n*(n+m))。

     3631、Watashi's BG  这题是出的第二多的题。很多人用先对物品排序,然后搜索加个剪枝过掉了,哈哈,我是先排序然后用两个优先队列模拟01背包的那个操作,心惊胆颤地2650ms过掉了。这是我第二次用这种方法做背包的题,第一次是Hdu 3810 Magina,用这种方法混到了榜首,然后我的博客被人看到了,别人开个外挂把我的榜首占据了。我觉得比较奥靠谱的做法是http://www.cnblogs.com/slon/archive/2012/07/29/2614380.html说的那种。我还是象征性地把我的代码发上来,误导下大家。

    3632、Watermelon Full of Water  这题我做得最得意。剩25分钟的时候H题和这题都有可能出,然后DTen和sssplk在搞H题,我觉得H这种找规律题要靠RP,能不能在25分钟内搞出是个未知数。于是让DTen讲了下这题题意,说完就觉得是水题,最后在离比赛结束还有55s的时候提交了一次,额,还只是在本机编译成功,没试过输入样例。但是,它竟然AC了,如果这RP能保留到现场赛,那就拿顽强拼搏奖的奖金了。言归正传,题目要求xx每天都要吃西瓜,这是个很重要的约束条件。我用从上上次训练学到的技巧--逆序处理来解这题,先保证最后一天有西瓜吃,那么当天的西瓜剧必须买,再保证第二天有西瓜吃,那么这天的西瓜必须买,这时如果西瓜可以吃2天,那么最后一天就可以不买,如果只能吃一天,那么两天的吸怪都必须买。不失一般性,到第i天的时候第i个西瓜必须买,它可以吃x天,那么要保证[i+x+1,n]这段时间有西瓜可吃,就必须在[i,i+x]这时间内买个西瓜,并可以持续到[i+x+1,n]时间内,因为[i+1,i+x]内的都已经计算好,那么直接找个最小值转移就好。状态转移方程:dp[i] = cost[i] + min{dp[j]} (i+1<=j<=i+x),查询最小值用线段树优化。    


     本次比赛赛后花了很多时间整理,也就造成了写总结时写了这洋洋洒洒的数千字,但是收获颇大,Tarjan复习了一下、对数学题恐惧小了许多、也认识了欧拉常数等等。明后天把G题补上,争取赛后AK。以下是部分程序代码,一些写得特别搓就不发上来了。我这里还有BEFIJ的一些小数据。

    数据和源码请见:http://blog.csdn.net/woshi250hua/article/details/7803614


    本文ZeroClock原创,但可以转载,因为我们是兄弟。

你可能感兴趣的:(c,优化,百度,Path,pair)