08 2019 档案
摘要:原题 题目链接 题目分析 无限循环小数化分数.把小数用分数表示,后面等比数列可以用求和公式化简,最后可以总结出一个通用公式(可以百度),这里不细讲.需要注意一下,题目没有明确说明循环部分从哪开始,因此需要枚举循环部分,找到分母最小的输出即可. 代码
阅读全文
摘要:原题 题目链接 题目分析 这道题用Pollard Rho算法不能交G++,会RE!!!先说一下整体思路,gcd指gcd(a,b),lcm指lcm(a,b).a=x*gcd,b=y*gcd,则x,y互质且有x*y=lcm/gcd,要使a+b最小,也就是x+y最小.这里可以看出我们要做的就是分解lcm/
阅读全文
摘要:原题 题目链接 题目分析 题意很明确,这里的模数是不互质的,因此不能直接套中国剩余定理.这里稍微讲一下中国剩余定理的扩展,假设前i个方程的特解为ans(i),通解为x(i)=ans(i)+k*lcm(前i个模数).把x(i)代入到第i+1个方程,用扩展欧几里得定理求解k=k0,ans(i+1)=an
阅读全文
摘要:原题 题目链接 题目分析 由题可知要求解一下方程组 (x+d)≡p(mod23) (x+d)≡e(mod28) (x+d)≡i(mod33) 很明显23 28 33互质,因此这道题只需要用中国剩余定理的结论求出ans-x+d,最后ans-d之后用ans=(ans%lcm(23,28,33)+lcm(
阅读全文
摘要:结论 先举个例子:设小数x=0.316459665766576657...下划线部分为小数后不循环部分,记a=316459,位数m=6,加深部分为小数后循环部分,记b=6657,位数n=4.则分数为(a*10n+b-a)/10m(10n-1),最后约分即可. 原理 把先小数用分数表示.x=a/10m
阅读全文
摘要:欧几里得算法-gcd gcd(a,b)=gcd(b,a%b),其中a为整数,b是不为0的整数. 证明: 如果a<b,a%b=a,明显有,gcd(a,b)=gcd(b,a). 如果a>=b,设a=k*b+r.设d为a,b的任意公因数,因为d|a,d|b,所以d|(a-k*b),因此d也是b和a%b的公
阅读全文
摘要:原理 Pollard Rho算法是一个非常玄学的算法(我个人还不是很懂其原理),作用是分解出一个数的非平凡因子(除1和它本身),通常作用于对大数的质因数分解.期望复杂度为O(n1/4).总体来说运行效果还是相当不错的. 算法核心:y=x,x=x*x+c.其中x,y初值是随机生成的,c也是随机生成的常
阅读全文
摘要:原理 由费马小定理可知,若p为质数,对于任意与p互质的整数a,有ap-1≡1(modp),假设我们要测试的数是x,然后在1到p-1内随机生成一个数作为底数a,然后测试它是否符合费马小定理,如果不符合则一定不是素数,符合则有可能是素数.单纯用费马小定理检验素数出错率很高(指满足费马小定理又不是素数的数
阅读全文
摘要:欧拉函数 定义:φ(x)为1至x中与x互质的数的个数. φ(x)=x*∏(p为x的所有质因子)(1-1/p) 简单说明一下,这其实是利用了容斥原理.假设x只有两个不同的质因子p,q,1至x中p的倍数有x/p个,q的倍数有x/q个,把这些数去掉之后,我们也许会重复去掉一些小于x既是p的倍数又是q的倍数
阅读全文
摘要:原题 题目链接 题目分析 第一眼可能看不出是最小生成树,但仔细想想其实题目所要求的就符合最小生成树的性质.因此只需要用prim算出最小生成树,在求的过程中记录最小生成树中边的最大值即可. 代码
阅读全文
摘要:原题 题目链接 题目分析 题目看似要求最大生成树,其实不然,输入时把所有边乘个-1,在求出来的最小生成树其实就是最大生成树了,只需要注意一下有可能无法生成连接所有点的树,这时候要输出-1. 代码
阅读全文
摘要:原题 题目链接 题目分析 比较明显的最小生成树模板题,题目给的输入是邻接矩阵,处理一下用prim算法就可以算出最小生成树了. 代码
阅读全文
摘要:原题 题目链接 题目分析 给无向图,求次短路.相对于第k短路而言次短路还是好求的,只需要在跑dijkstra的过程中顺便记录次短路就行了. 代码
阅读全文
摘要:原题 题目链接 题目分析 了解题意后会发现跑两次最短路就能解决问题了,首先考虑奶牛们回家时的路径,其实只要从聚餐点跑一次最短路,记为dis2[],而考虑奶牛们出发时的最短路,只需要把所有边反置一下,再从聚餐点跑一遍最短路,记为dis[],最后只需要找出牛i使得dis[i]+dis2[i]的值最小即为
阅读全文
摘要:原题 题目链接 题目分析 题目要求判断是否存在一条回路,使得回路的距离之和为负数,其实就是图中是否存在负圈,因此可以用bellman来判负圈,如果bellman更新了n次则证明出现负圈,因为n个点构成的图最多只能有由n-1条边构成的最短路.bellman跑了n次则证明存在n条边构成的最短路. 代码
阅读全文
摘要:原题 题目链接 题目分析 最短路问题,题目要求与其他牛平均最小分离度,事实上就是先求出这头牛到其他所有牛的最短距离之和在求个平均值.题目所给的一群牛上演一个电影其实就是这群牛之间互相存在一条长度为1的边.由于题目要求任意两点的最短路,所以选用Floyd算法来实现.最后找出最短距离之和ans后,ans
阅读全文
摘要:原题 题目链接 题目分析 并查集经典用法,是维护信息的并查集.由于只有两个帮派,那对于每个人需要给它创建两条信息,属于1帮派和属于2帮派.这两条信息是相互矛盾的.当得到一条信息,a和b不是同伙的时候,只需要合并a是1帮派的信息和b是2帮派的信息以及a是2帮派的信息和b是1帮派的信息即可.这道题保证信
阅读全文
摘要:原题 题目链接 题目分析 比较明显的并查集题目,先用一个标记数组表示电脑的修复状态,每当修复一个电脑,就用标记数组标记一下,然后遍历一下所有电脑,如果遍历的电脑已被修复且在该电脑连接距离范围内,就合并这两个电脑.查询的话就是常规的并查集查询操作. 代码
阅读全文
摘要:原题 题目链接 题目分析 题目要求取中位数,我们可以枚举以每个牛的分数作为中位数,然后选出最省钱的方案,最后只需要看花钱数不超过F中的最高的中位数分数即可.说一下具体实现,先对所有牛按分数从小到大排序,选出最省钱的方案可以用优先队列来选,设half=n/2,当优先队列的牛超过half个的时候就把一个
阅读全文
摘要:原题 题目链接 题目分析 贪心题,想一下就会发现对于一种防晒乳,应该优先给那些最大SPF等级较低的牛用.因为他们能用的防晒乳更少.实现的话只需要把防晒乳的SPF等级按小到大排序,然后没遍历一种防晒乳就把能用这瓶防晒乳的牛全部加入一个优先队列中,优先队列取出最大SPF等级最小的牛即可. 代码
阅读全文
摘要:原题 题目链接 题目分析 明显的01背包,但还是由细节需要处理,设置dp[i][j]=前i头牛中选的TF为j时最大的TS值,由于TF可能为负数因此要加一个基数使其在大于等于零,dp初始化为-1,dp[0][0]=0.更新的时候dp[i][j]=max(dp[i-1][j-f[i]]+s[i],dp[
阅读全文
摘要:原题 题目链接 题目分析 多重背包题,在放入的时候需要按a的大小排序.定义dp[i][j]为前i个积木凑成j高度,第i个物品最多剩下多少,然后j从0遍历到a[i],dp初始化为-1,dp[0][0]=0.更新方式跟多重背包完全一样,if(dp[i-1][j]!=-1) dp[i][j]=c[i];e
阅读全文
摘要:原题 题目链接 题目分析 有点难的dp,首先可以这样定义dp[j][k],选了j个人,它们的p[i]-d[i]的和为k,此时的最大p[i]+d[i]的值,由于p[i]-d[i]的值可能为负,所以必须处理一下,也就是让k的值加上m*20(也就是设k=m*20为0),就可以保证k的值为非负整数.这个dp
阅读全文
摘要:原题 题目链接 题目分析 有点难的dp,首先考虑一下对于第i个山坡,要使单调,不是把它改成跟上一个相等就是把它改成跟下一个相等,因此改完后的值肯定是原序列的一个值,首先考虑递增,先把原序列按从小到大排个序,把它当为b[i],然后对于原序列的每个数,考虑将它变为b[i]中的其中一个使得其花费最小,因此
阅读全文
摘要:原题 题目链接 题目分析 由题目知,如果能求出连接点的最长递增子序列,则可以把连接不在该序列中的点的线全部剪掉.而维护最长递增子序列可以用dp来做,考虑到相同长度的递增子序列末尾数字越小越好,可以这样定义dp,dp[i]长度为i的递增子序列的最小末尾值,初始化为INF,由于这个dp具有有序性,因此可
阅读全文
摘要:原题 题目链接 题目分析 题意很明确,就是要维护单调递增的序列,最后看有多少种单调序列即可,设定一个dp数组,cnt表示数组大小,初始化为0,然后把所有木头从小到大排个序,当遍历到木头i时,如果dp数组里有比木头i还小的,就代替它,否则就dp[cnt++]=木头i,最后cnt就是答案. 代码
阅读全文
摘要:原题 题目链接 题目分析 完全背包题,不过需要状压和处理大数,首先定义dp[i][j]为用前i种货币(从1-k),凑出j价格的方案数,dp初始化为0,然后更新有两个方向,第一种显然dp[i][j]+=dp[i-1][j],第二种dp[i][j]+=dp[i-1][j-i]+dp[i-1][j-2i]
阅读全文
摘要:原题 题目链接 题目分析 计数dp题,感觉其实也可以用组合数学做,但我太菜了,推不出通用公式.dp可以定义dp[i][j]为前i种选j个蚂蚁有多少种选法,然后递推公式如下,其中c[i]表示第i种的数量, dp[i][j]=Σ(min(j,c[i]),k=0)dp[i-1][j-k].可以化简一下,d
阅读全文
摘要:原题 题目链接 题目分析 有点难度的区间dp题,可以这样定义dp[i][j],把s[i-j]变为回文串的最小花费,显然s[i][i]=0,先说一下删除字母和添加字母的处理,因为当s[i-j]是回文串的时候,再往外扩展一个字母有两种方法,一种是删除这个字母,另一种是再添加一个字母,因此输入删除字母和添
阅读全文
摘要:原题 题目链接 题目分析 简单dp,很容易想到对于每个区间都只有两个选择,选和不选,因此可以定义一个dp[i],表示在前第i个区间能取得的最大奶量(区间已按起始时间排完序),注意在读入区间时可以直接在末尾时间直接加上R.更新由两个循坏来更新,第一个循环i从头区间遍历到尾区间,第二个循环j从头区间到i
阅读全文
摘要:原题 题目链接 题目分析 基础dp题,按照题意很容易给出dp定义,dp[i][j],表示在i时间内,用j次转移机会得到的最大苹果数.dp转移如下,如果j==0,则dp[i][j]=dp[i-1][j],否则 如果当前位置有苹果dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])
阅读全文
摘要:原题 题目链接 题目分析 计数dp,dp[i]定义为i有多少种分解方案,对一个数i,首先如果它是奇数,则它的方案总数与i-1的方案总数相同,因为只需要在i-1的每个分解方案+1即可.如果它是偶数,则i/2的每个分解方案的每个数*2即可得到i,这样得到的i的分解方案是不存在1的(因为*2所以至少为2)
阅读全文
摘要:原题 题目链接 题目分析 非常基础的dp题,先把原图存下来,然后在造一个与原图相匹配的dp,dp更新方案如下,如果j==1 则dp[i][j]只能从上一层的dp[i-1][j]更新过来,因此有dp[i][j]=dp[i-1][j],如果j==i,则dp[i][j]只能从上一层的dp[i-1][j-1
阅读全文
摘要:原题 题目链接 题目分析 有点难度的贪心题,首先考虑在相同时间t内怎么能使损失最少,可以这样来控制相同时间,设想一个子问题,如果只有两头牛,那最后结束时间肯定是一样的,这时候怎么使损失最少,就直接比较t1*d2和t2*d1就行了,如果是第一个小就选牛1,否则选牛二.扩展来讲,就是对所有牛排序,对于牛
阅读全文
摘要:原题 题目链接 题目分析 数学贪心题,每次取两个最大的合成,合成到最后即可使值最大. 代码
阅读全文
摘要:原题 题目链接 题目分析 有点难码的贪心题,策略是先能用大面额的就用大面额,然后凑出的价格不要高于c,如果凑到最后不能刚好凑完c,则能用小面额补就用小面额补,目的是让凑出的价格尽可能接近c,这样能少浪费钱,具体实现就是先从现有硬币里按照上述规则找一套凑法,然后不断用这个凑法凑直到硬币不足为止,接着又
阅读全文
摘要:原题 题目链接 题目分析 无脑贪心枚举题,只是码起来麻烦,想清楚后基本没什么问题. 代码
阅读全文
摘要:原题 题目链接 题目分析 简单贪心题,从第一周开始,每过一周就把当周酸奶的生产价格加入优先队列中,不过由于存储要钱,所以加入优先队列需要一点额外操作.想一下当i周时,第一周生产的酸奶加上存储成本c1=c1+s*(i-1),第二周生产的酸奶同理,c2=c2+s*(i-2)...我们要从中选处理后价格最
阅读全文
摘要:原题 题目链接 题目分析 分开处理,可以按起始时间给所有牛排个序,然后从小到大遍历所有牛,每遍历一头牛i就把他加入到一个优先队列中,然后从优先队列中取出结束时间最大的牛j,如果牛j的结束时间比牛i的起始时间小,那证明轮到该牛时已经可以多出一个桶了,于是可以把牛j从优先队列从弹出,并让桶的数量--,注
阅读全文
摘要:原题 题目链接 题目分析 把每个点处理成一个区间[li,ri],其中li表示x-sqrt(d*d-y*y),ri表示x+sqrt(d*d-y*y),前提是d>=y,否则雷达无法检测到该点直接输出-1.处理完之后,把所有区间按左端点值排个序,排完后每取一个区间[s,t],就把其他区间中si<t的过滤掉
阅读全文
摘要:原题 原题链接 题目分析 先按起始时间排序,然后规定一个变量来记录当前时间,假设当前时间是t(当前时间还未被清理),那就在排完序的区间里把起始时间小于t的牛依次加入到一个优先队列中,在优先队列里每次都取终止时间最长的牛,并以此来更新当前时间.假设取出一种牛[si,ti],si<t,则取出后t=ti+
阅读全文
摘要:原题 题目链接 题目分析 bfs限制步数后爆搜就行了,答案用set维护(用来去重). 代码
阅读全文
摘要:原题 题目连接 题目分析 这道题的难点在于搜的技巧,仔细观察会发现有些规律,就如样例一 3 1 2 4怎么得到16的,事实上是3*c(0,3)+1*c(1,3)+2*c(2,3)+4*c(3,3),具体为什么是这样可以参考杨辉三角,看每个数字贡献多少值即可.因此直接用全排列搜,搜到答案的话肯定是字典
阅读全文
摘要:原题 题目链接 题目分析 题目要求将一组数组成两个数,注意不能有前导零,要求差绝对值最小, 所以要取两个位数最接近的数来做差,然后搜就完事了.搜法可以用全排列搜,由于只取两个数,就可以直接取前half个数作为一个数,剩下的作为一个数,做差就行了,这样全排列刚好能遍历所有情况. 代码
阅读全文
摘要:原题 题目链接 题目分析 这道题难点在于怎么处理地图标记问题.可以这么处理,在每个格子里记录被流星砸的最早时间,如果这个格子不会被砸到则记为INF,然后跑bfs的时候加入一个参数来记录当前跑到第几步,也就是当前时间为多少,当当前时间now+1<要走格子的时间时(也就是下一步走到这个格子是安全的),就
阅读全文
摘要:原题 题目链接 题目分析 注意题目给的条件,石头到终点会终止.石头碰到冰块会停止,冰块消失.石头滑出边界,游戏失败.石头必须在10回合内到达终点否则游戏失败.按照这个条件写个dfs,记录一下深度就行了. 代码
阅读全文
摘要:next数组和extend数组 设有字符串S,T,next[i]表示T[i...len]与T[0..len]的最长公共前缀,extend[i]表示S[i...len]与T[0...len]的最长公共前缀,扩展kmp要做的就是把extend数组求出来. 思路 假设当前在匹配到s串的i位置,设p=i,然
阅读全文

浙公网安备 33010602011771号