Training 1.1
作者:互联网
学习内容:最短路负环处理,dp与FFT刷题
1.负环(P3385)
spfa判负环,若有一个点的入队次数>=n则说明有负环。
2.守望者的逃离(P1095)
考虑到以时间为状态转移,但魔力和跑步同时算比较麻烦,于是可以先算出全用魔力的策略,再迭代一次计算加上跑步的情况。
实际上通过计算我们可以知道在这道题中魔法是要优于跑步的,但问题就在于临近结尾的时候,跑步可能会优于魔法,于是采用再迭代一次来实现。
3.Interesting Function(cf1538F)
这道题是一道很好的数位思维题。实际上对于每个整数,每一位都是一个状态,当改变某一位是,这个位的状态发生改变。回到本题,当一个数加1时,末位的状态一定会发生改变,而倒数第二位的状态则是每当末位进位时改变,那么我们开始考虑末位进位的规律,即遇到9时会进位,在第一次加到个位为9后,之后变为个位变10次,十位变1次,同理可类推到前面的每一位。
那么本题所求即为各位数变化的次数之和。显然,最后一位变化了r-l次,那么十位呢?我们先前提到,从个位第一次遇到9后,每10次就会变化一次,这样的确可以计算出十位,但十位何时会变到9就不方便计算,不利于迭代。
换个思路来想,刚才我们是从什么时候会变来考虑(从原因考虑),那么如果我们从结果考虑,某一位最后一定会成为r中的某一位。而对于某一位来说,它加1只会影响其与其之前的部分,并不会影响后面的位,那么我们可以先不考虑后面的位,让这个某一位成为最后一位,显然,此时情况与个位的情况是一样的,为r'-l',其中r'和l'为以该位为最后一位的r和l。
那么这道题的思路就很明显了,每次r和l除以十,变为r'和l',循环求解。
做数位题要摆脱整数的固有思维,但又要适当利用整数的性质。
4.Number of Pairs(cf1538C)
显然要先把数组排序。题中要求l<=ai+aj<=r的对数,即求ai+aj<=r的对数和ai+aj<=l-1的对数。
对于每个ai来说,可以二分找出第一个大于等于r-ai的值,从而求解。
对于有序的数组,二分要优先考虑。
另外,本题还给我们的一些启示就是对于找有多少对满足题意的题,有时要特判的包括ai与ai自己组成一对,针对每个ai计算后要总的ans/2等等。
5.Buying Hay S(P2918)
问题的难点就在于要>=h,这就使得我们无法确定我们要求的答案是dp[?]。考虑到数据范围为<=5000,那么我们只需要枚举j从H到H+5000就可以了。
注意在处理这种要重量要恰好等于某个值的时候,要把dp[重量]设置为INT_MAX,dp[0]=0;
在遇到没有见过的题时,正解不一定是新算法,可能只是加了一些奇奇怪怪的思路~
标签:Training,1.1,ai,十位,一位,跑步,考虑,dp 来源: https://blog.csdn.net/ando_ando/article/details/122268208