• 2017.08.06【NOIP提高组】模拟赛B组


    Summary

      今天的比赛60+100+100=260分,没有想到第一题正解是搜索,我与AK差一段距离,这段距离,叫倒着搜。总的来说不是很难。

    Problem

    T1 天平

    题目大意

      给你N个排序好的砝码的质量,从第三个砝码开始,它的重量最少是前两个砝码的质量之和。天平容不得超过C质量的质量。问最大的质量可以是多少。

    想法

      一般Usaco的题目都不会水到哪里去,但是今天的。。。

      有两种方法。

    (1) 爆搜+剪枝

      爆搜应该都会,参数是枚举到第K个,当前砝码是重S

      优化一:如果当前的砝码质量加上没有抉择(没有递归到)的砝码质量还是不能比当前得出的最大值大,则剪枝

      优化二:倒着搜可以减少之后的分支,当然可以降低时间复杂度,是个很了得的东西,有道题靶形数独同样适用这种方法。

    (2) 中途相遇法

      这个方法效率很玄,但是总比爆搜稳妥

      可以把1~(n+1)/2和(n+1)/2~n这两段的方案数用dfs求出来,然后枚举。

      可以用二分来找,最好用两个指针。

    T2 游历的路线 

    题目大意

      在从1城市开开始走到n城市,期间有m天,其中第m天一定要在n城市,两两城市之间来或往的马车费用是周期性的,并且有些时候可能不可以从某个城市去另一个城市,问满足条件的最小费用。

    想法

      显然可以用动态规划。

      设f[i,j]表示第i天到第j城市

      显然需要知道i-1天在哪个城市,我们可以枚举,设i-1天在k城市

      f[i,j]=min{f[i-1,k]+s}(其中s代表费用,费用的周期可以用除法原理来算(x-1) mod y+1)

      初始化显然,效率显然,答案显然。

    T3 最短路(shortest)

    题目大意

      求从(0,0)~(n,m)经过点的和的最小值。

      第(x,y)点的权值为f[x,y],他的计算方法是f[x,y]=f[x-1,y]+f[x,y-1],如果(x=0) or (y=0)那么f[x,y]的值为1

    想法

      通过一系列的对拍,我们可以发现,如下图红边的走法,必定最优,但不知道怎么证明。我们设较短边的长为n,较长边的长为m

      

      我们可以总结成一个公式

      

      那么,关键就成了如何求出F[i,m] (i=1~n)。

      我们考虑把他转化成组合数的形式

      根据题目给出的F数组计算方法,可以得出f[x,y]=C(min(x,y),x+y)

      那么显然F[i,m] (i=1~n)就是C(i,i+m) (i=1~n)

      其实每个组合数,可以理解成一个数除另一个数,比如对于C(n,m)

      

      试想一下,如果x<y,求C(x,y)+C(x+1,y+1)+C(x+2,y+2),我们设上面这个式子分子为tot1,分母为tot2

      C(x+1,y+1)相比C(x,y)的tot1和tot2,发现tot1多乘了y+1,tot2多乘了x+1,

      C(x+2,y+2)相比C(x+1,y+1)的tot1和tot2,发现tot1多乘了y+2,tot2多乘了x+2

      说明,我们每次循环,tot1都乘i+m,tot2都乘i,那么,每次的C(i,i+m)就是tot1/tot2

      但是问题来了,tot1和tot2都很大,如果相除是不太可能的,先mod再除答案是错误的,只能使用逆元了。

    逆元

      根据费马小定理可以得到如下式子

      

      两边同时除b得到,高斯研究过,发现是等价的

      

       两边同时除b得到,高斯研究过,发现是等价的

      

      两边同时乘一个a,并且交换位置,得到如下式子

      

       发现,我们要求a除b取模p的结果,其实是等价于abp-2取模p的结果的,也就是说,欲想知道a除b取模p的结果,其实就是算出abp-2取模p的结果就行了

      因为a*b mod p,是等价于a mod p*b mod p的,ak mod p是等价于(a mod p)k的,所以我们这里可以取mod来避免高精度。

      当然,F[i,m] (i=1~n)这一部分,可以使用一个组合公式就可以了,具体实现和题解请选手自行考虑。

  • 相关阅读:
    Windows下安装MySQLdb(mysql-python)报错解决
    关于安装bettercap的ERROR: Failed to build gem native extension 报错解决
    Centos6 下启动httpd报错 Could not reliably determine the server's解决方法
    Linux安装mysql-python库时报错解决办法
    [Flask]学习Flask第三天笔记总结
    [原创+实战+钓鱼]setoolkit+映射
    [实战]挖掘CSRF姿势
    [实战]记一次PUT方法拿下网站shell
    JAVA二维数组小记
    技术杂谈
  • 原文地址:https://www.cnblogs.com/philchieh/p/7295624.html
Copyright © 2020-2023  润新知