随笔分类 - ACM
大二到大三不堪回首的记忆....
摘要:原题链接 考察:模拟 思路一: 枚举每一年的每一月,看该月13号离1900年1月1日有多少天,对天数模7统计. 这里比较简单的做法是计算xxxx年x月的1日离1900年1月1日有多少天,再+12天就是13号离它多少天. 1 #include <iostream> 2 #include <cstdio
阅读全文
摘要:原题链接 考察:贪心 思路: 6*6的箱子可以放下1个6*6、5*5、4*4,再用a[2]与a[1]填补空缺. 3*3需要分情况讨论,一个6*6可以放下4个3*3,剩下的可以用a[3]、a[2]、a[1]补. 1 #include <iostream> 2 #include <algorithm>
阅读全文
摘要:原题链接 考察:贪心 思路: 手测几个样例可以发现:当n>3时,有两种策略: a[1]与a[i]过去,a[1]返回,a[1]与a[i-1]过去,a[1]返回,此时还未过去的人数-=2 a[1]与a[2]过去,a[1]返回,a[i]与a[i-1]过去,a[2]返回,此时还未过去人数-=2 本蒟蒻将最优
阅读全文
摘要:原题链接 考察:递推 思路: 设f[i]是i与其他牛的噪音和,我们可以发现它与f[i+1]的关系是f[i+1] = f[i]+i*d-(n-i)*d(d为与i+1的距离).实际是指f[i+1]比f[i]多i个d的距离,而f[i]又比f[i+1]多计算了(n-i)个距离. 1 #include <io
阅读全文
摘要:原题链接 考察:贪心 错误思路: 为了让利益最大,任务时间首先要尽可能大,在时间相同情况下,等级要尽可能大.采取双指针的类似思想,排序后从尾到头遍历,从m~1找到所能完成的任务数,如果机器时间或者等级<当前任务就continue 此思路错在如果最大时间的机器等级非常低,而完成任务的机器都排在后面就会
阅读全文
摘要:原题链接 考察:贪心 这道题的贪心好难理解....在网上也没看到证明... 思路: 首先是洗衣服的时间,这时所有衣服的开始时间相同.用优先队列存储每个洗衣机,每件衣服都用耗时最少的,如果该洗衣机被选过一次,那么就相当于有一台t*2的洗衣机.由此算出每件衣服洗完的时间. 然后是烘干的时间.看了很多题解
阅读全文
摘要:原题链接 考察:贪心+模拟 错误思路: 预处理一遍>0的最小的数字和它在序列里出现的次数.在从头到尾遍历,讨论0与s[i]与minv的大小关系.用deque模拟 这样想其实没错,但是要讨论很多限制条件,看了别人的题解思路简单又快速... 正确思路: 从右往左找,找到除0外最小的数字,它右边的直接按顺
阅读全文
摘要:原题链接 考察:贪心 思路: 最小数量很好求,从大到小贪心即可.关键是最大数量.我们要考虑全部取最小的剩下的还能否被表示的问题.直接取很难求,至少本蒟蒻没想出来怎么求. 我们求出C的最小数量后,可以发现剩下的是表示总钱数sum-C的最大数量.根据此我们可以求出sum-C的最小数量,剩下的就是最大数量
阅读全文
摘要:原题链接 考察:贪心 思路: 贪心策略:从价值高的开始取,直到背包体积不够用. 乍一看很像背包问题,但是这里给的是单价,而背包问题是总体价值且不能分割. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #incl
阅读全文
摘要:原题链接 考察:贪心 错误思路: 用区间选点的模板处理,然后发现很难处理连续有重合区间与不重合区间....没在网上看到用这种解法的,基本都是下面的解法. 正确思路1: 将区间拆成两个时间点,到达时间增加人数,离去时间减去人数.将这些人按时间排序加减即可. 1 #include <iostream>
阅读全文
摘要:原题链接 考察:贪心 大水题. 思路: 排序,从后往前加.每三个加一个最后的. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6
阅读全文
摘要:原题链接 考察:区间dp 递推思路: 套区间dp模板,划分集合的时候分为增加或者减少 f[i][j]为当前区间为[i,j]时变为回文串的最小花费. 就和密码脱离那道题差不多,if s[i] = s[j] f[i][j] = f[i+1][j-1]. else f[i][j] = min(f[i+1]
阅读全文
摘要:原题链接 考察:记忆化搜索 错误思路: 将f[i][j]定义为达到此点的最大分数,结果是TLE. 正确思路: 和滑雪那道题一样,要将f[i][j]定义为从mp[i][j]出发的最大分数. 应该考虑记忆化搜索的优化原理是搜过一次就不要再搜 1 #include <iostream> 2 #includ
阅读全文
摘要:原题链接 考察:记忆化搜索 错误思路1: 数组记录x与y的值,如果重复出现就判死循环. 审题,只有当x的值与操作在此前出现过才是死循环,y的值不影响循环,而单凭x的值也不能判死循环.因为可能进行的操作会不同.所以根据x与下一个操作才能判定一个状态. 错误思路2: for循环i-1遍,用bool数组记
阅读全文
摘要:原题链接 考察:树形dp 思路: 设f[i][j]表示和为i,j==1表示经过了>=d的边,j=0表示未经过的方案数.以最后一步来划分集合,最后一步的和为i-j,此时边为j,那么状态转移方程是: if(j>=d) f[i][1] = f[i-j][0]+f[i-j][1] else f[i][1]
阅读全文
摘要:原题链接 考察:记忆化搜索 思路: dfs模拟即可,用map判断当前数字出现过几次.但是回溯的时候要注意,如果本该有的数字没有说明被凑成了一对,但是恢复要恢复成1,如果有就要去掉这个数字. 本蒟蒻真的写得很繁琐,这位大佬利用位运算0 1的性质避免了判断2,很妙 GO 网上题解基本都用了步数作为参数,
阅读全文
摘要:原题链接 考察:记忆化搜索 太菜了太菜了,说实话本蒟蒻完全没看出来为什么要用记忆化搜索.T了两次算了搞明白了点. 假定数据: a = aaa,b = aaa, c = aaaaaw. 很容易看出答案是错的,但是dfs会不断搜索,在返回的时候,用了b一个字符会在优先使用a一个字符.而此状态被搜索过,因
阅读全文
摘要:原题链接 考察:记忆化搜索 15min内WA 6次,不愧是我 思路: 按题目意思走即可. 坑点: 记忆化数组的n必须开很大,否则WA.因为在m>0&&n>0内,m每减一次1,n就要累加一次和. 可能要开long long, 1 #include <iostream> 2 #include <cstr
阅读全文
摘要:原题链接 考察:记忆化搜索 思路: 可用递推和记忆化搜索两种方式. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 const
阅读全文

浙公网安备 33010602011771号