随笔分类 - ACM
大二到大三不堪回首的记忆....
摘要:原题链接 考察:dp+矩阵快速幂 思路: 首先了解邻接矩阵的一个性质:当邻接矩阵Tk , aij表示从i到j长度为k的路径数有aij条.以k = 2为例,aij*ajk 表示从i->j有一条路,从j->k有一条路.总体就是i->k有一条路.当j变化时就能得到方案数. 但是这道题的边权并非为1,这个性
阅读全文
摘要:原题链接 考察: 矩阵快速幂 思路: f[N]表示1~n栈灯在t 秒的状态,每盏灯只与它自己和它左边的灯有关.构造n*n的矩阵,在它自己和它左边的灯的位置取1,可以发现res[i] = (f[i-1]*a[j][i]+res[i])%2. 1 #include <iostream> 2 #inclu
阅读全文
摘要:原题链接 考察:矩阵快速幂+floyd最短路 思路: 首先明白这道题不是矩阵相乘,res[i][j] = min(res[i][j],a[i][k]+b[k][j]). a[i][j]如果代表经过x条路的最短路,b[i][j]代表经过y条路的最短路.那么res是经过x+y条路的最短路. 注意: 图上
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 构造1X4的矩阵{f[n],f[n-1],f[n-2],S[n]},根据给出的递推公式很容易构造出a矩阵.注意数据有n = 1和n = 0的情况,需要特判. 1 #include <iostream> 2 #include <algorithm> 3 #inclu
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 入门题,ans = fk = f*fk-1.注意的是不能只保留主对角线的元素,因为主对角线的元素会随同行同列的元素变化 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 usin
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 题目的递推式是找不到关系矩阵的,由此必须换一个思路.由题目的数据范围发现n小m大,可以考虑由第i列推到第i+1列,我们要由一个1x(n+2)的矩阵*(n+2)x(n+2)的矩阵 = 新的1xn+2的矩阵.从常数项先考虑,我们要从233->2333. 显然 2333
阅读全文
摘要:原题链接 考察:线性dp+矩阵快速幂 思路: 将限制条件作为动态规划的维度,某两个数字不能紧连,这只与骰子的上面或下面有关,可以用f[i][j] 表示第i个骰子,其最上面是j.f[i][j] = f[i-1][k]*4,j的对面与k不互斥,骰子可以绕中心旋转.如果互斥常数就是0.时间复杂度n*6*6
阅读全文
摘要:原题链接 考察:矩阵快速幂 思路: 矩阵快速幂的入门题,记住模板. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 typed
阅读全文
摘要:原题链接 考察:计数dp 错误思路: 以最后一个数来划分...f[i][j]表示选i个数,总能量为j的方案数 f[i][j] +=f[i-1][j-k](0<=k<=j)k表示最后一个数是k. 此思路错在会计重. 正确思路: 按照集合中最小的数是0和>0来划分.f[i][j]表示和为i,数个数为j的
阅读全文
摘要:原题链接 考察:IDA* or 状压+背包dp 思路一: n个物品包,每个都可以用二进制表示,f[i][j]表示前i个物品组成j状态最少需要多少包,状态转移方程为 int t = min(f[i-1][j|candy[i]],f[i-1][j]+1); f[i][j|candy[i]] = min(
阅读全文
摘要:原题链接 考察:搜索 思路: 这道题不需要找根,从头到尾搜索即可.因为最外层括号一定是最外层的递归,搜里层括号相当于搜索叶子结点.当搜索到|说明左结点已经搜索完毕,应当搜索右节点,而右节点也想当一个二叉树.直接dfs即可.这里的dfs不需要变量,因为不需要回溯. 1 #include <iostre
阅读全文
摘要:原题链接 考察:最大公约数 思路: 设原序列为a1,a2,a3...an,公比为(q/p)t,题目给的样例是在a数组中随机抽取一些数,形成新序列 b1,b2,b3...bn,可以发现b2/b1 = (q/p)k1 b3/b1 = (q/p)k2 ,显而易见k1与k2都是t的倍数,对k求最大公约数就是
阅读全文
摘要:原题链接 考察:dfs+约数 错误思路: 倍数法求出所有约数,N要开到1e9必然MLE且TLE 正确思路: 观察约数之和的式子 s = (1+p1+p12+p13+..)*(1+p2+p22+p23+...) ,要满足能够这种性质的数在1~2E9内较少.再继续观察,假设p全为2,(1+2)*(1+2
阅读全文
摘要:原题链接 考察:唯一分解定理 思路: 很容易想到最长公共子序列,dp只能求出长度,不能求出个数.我们模拟样例,100的约数 2 4 5 10 20 25 50 100. 最长是4, 2 4 20 100也可以是5 10 20 100可以发现开始的数必然是素数,而序列可以表示成 2,2*2,2*2*5
阅读全文
摘要:原题链接 考察:贪心 这道题和均分纸牌有点像,但是做法不完全一样 思路: 参考均分纸牌问题,考虑操作对前缀和数组的影响,可以发现每交换一次sum[i-1]变成了sum[i],而sum[i]变成了sum[i-1](0<i<n),根据取值范围可以发现i=0与i=n是不能交换的,所以我们只能分配sum[i
阅读全文
摘要:原题链接 考察:贪心 错误思路一: 排序,加上n+1个较大值,减去m个较小值. m个减号不一定是全部用来减,可以利用两个减号a-(b-c)转化为a-b+c,如果a-b+c>a+b-c此思路就错误. 正确思路: 如果要凑最大值,那么需要()max-()min.但是这样的表达式看起来只需要一个+,如果我
阅读全文
摘要:原题链接 考察:贪心 错误思路: 将两个负数作为一个数纳入新数组排序,从大选到小. 这个思路错在如果存在两个负数的积比一个正数大,而两个正数的积又比负数积大,这样会答案错误. 思路: 分类讨论 k为偶数,正数和负数都必须两个两个选,这里运用到了双指针算法.此时选出的答案一定为正数. k为奇数,此时负
阅读全文
摘要:原题链接 考察:贪心 思路: 很明显付的钱尽量是花费钱的平均值.如果有人的钱<平均值mid,付的钱是他自己的钱,那么mid-a[i]就要钱>mid的同学补上.但是这里模拟补上比较复杂.当a[i]<mid时,付了a[i]的钱,要付的钱变成了s-a[i],在剩下n-i个人中,要让他们付s-a[i]的钱,
阅读全文

浙公网安备 33010602011771号