01 2018 档案

摘要:贪心加优先队列维护。 先把每个建筑的t1和t2读进来,然后按照t2排序。 枚举建筑,当枚举到第i个建筑时,ans表示在t2[i-1]范围内可以修的最多建筑,now表示修这些建筑所需的最少时间。 如果可以修第i个建筑,即t1[i]+now<=t2[i],则now+=t1[i]。 否则就判断是否要不修已 阅读全文
posted @ 2018-01-25 17:05 TrassBlose 阅读(96) 评论(0) 推荐(0)
摘要:二分图最大匹配匈牙利算法。 阅读全文
posted @ 2018-01-24 19:18 TrassBlose 阅读(120) 评论(0) 推荐(0)
摘要:一看就想到了二分图最大匹配的匈牙利算法。 注意要加时间戳优化,不然会超时。 在网上找到了并查集做法,不难理解。 如果没有出现环,那么结果肯定是一片森林。 我们肯定每次选小的。 如果出现了环,那么环所在集合每个数都可以选了。 于是我们使用并查集维护集合。 保证集合的祖宗是整个并查集中最大的属性值。 每 阅读全文
posted @ 2018-01-24 18:57 TrassBlose 阅读(113) 评论(0) 推荐(0)
摘要:正着思考是无法得出答案的。 考虑容斥,可能发生越狱的状态=全部状态-不可能发生越狱的状态。 全部状态就是M^N。 不可能发生越狱的状态:第一个房间是随便什么宗教,而第二个房间不能和第一个一样,而第三个房间不能和第二个一样…… 用乘法原理算一下就是M*(M-1)^(N-1)。 快速幂即可。 阅读全文
posted @ 2018-01-24 18:41 TrassBlose 阅读(112) 评论(0) 推荐(0)
摘要:map。 注意要当c=0时要去重。 阅读全文
posted @ 2018-01-24 14:24 TrassBlose 阅读(132) 评论(0) 推荐(0)
摘要:接起来试试看。 C++string自带比较,比较的是字典序的大小。 自带+运算符,可以把两个字符串接在一起。 阅读全文
posted @ 2018-01-24 13:57 TrassBlose 阅读(81) 评论(0) 推荐(0)
摘要:排序一遍,保证数值相同的数放在一起。 直接枚举每一个数判断和前面的数是否相同:相同就累加数量;否则就输出,然后把数量重置为1。 阅读全文
posted @ 2018-01-24 13:53 TrassBlose 阅读(97) 评论(0) 推荐(0)
摘要:正解应该是求带权树的重心,然而这个数据范围用Floyed就可以了。 阅读全文
posted @ 2018-01-24 13:39 TrassBlose 阅读(138) 评论(0) 推荐(0)
摘要:树状数组的模板。 阅读全文
posted @ 2018-01-24 13:22 TrassBlose 阅读(93) 评论(0) 推荐(0)
摘要:设calc(a,b)就是计算a/b取上整。 设三种铅笔的数量为a1,a2,a3,价格为b1,b2,b3。 答案就是min(calc(n,ai)*bi)。 阅读全文
posted @ 2018-01-24 13:06 TrassBlose 阅读(103) 评论(0) 推荐(0)
摘要:差分。 设a[i]为这个点被多少个区域包含。 设f[i]为a[i]-a[i-1]。 于是每次读入一个区间[u,v]就把f[u]++,f[v+1]--。 每次计算前加上f[i]就是a[i]了。 只有当a[i]=0时这棵树才没有被砍掉。 阅读全文
posted @ 2018-01-24 12:57 TrassBlose 阅读(168) 评论(0) 推荐(0)
摘要:递推。 f[i]表示把i进行处理可得的数的个数。 枚举头部接什么数可得递推式f[i]=1+∑f[j] (j<=i/2)。 其实可以用前缀和优化,不过这题的数据范围没这个必要。 阅读全文
posted @ 2018-01-24 12:43 TrassBlose 阅读(78) 评论(0) 推荐(0)
摘要:全部转化成角为单位计算。 阅读全文
posted @ 2018-01-24 12:37 TrassBlose 阅读(101) 评论(0) 推荐(0)
摘要:贪心。 先按纪念品的价格排序一遍。 考虑最小的一个纪念品:如果可以和最大的纪念品合成一组,就合成一组。否则就让最大的纪念品单独一组。 阅读全文
posted @ 2018-01-24 12:07 TrassBlose 阅读(123) 评论(0) 推荐(0)
摘要:模拟。 阅读全文
posted @ 2018-01-24 12:01 TrassBlose 阅读(96) 评论(0) 推荐(0)
摘要:先把各条地毯的数据存储下来。 然后从后往前找到的第一条包含(x,y)的地毯编号就是答案。 阅读全文
posted @ 2018-01-24 11:45 TrassBlose 阅读(105) 评论(0) 推荐(0)
摘要:体积和价值设为相等做一遍01背包。 然后输出v-f[v]即可。 阅读全文
posted @ 2018-01-24 11:37 TrassBlose 阅读(116) 评论(0) 推荐(0)
摘要:很容易想到把大于b的数赋值为1,小于b的数赋值为-1。 做一遍前缀和。 于是问题变成求sum[j]-sum[i]=0 (0<=i<w && j>=w) 于是直接按照b所在位置划分成两段,分别用桶统计sum某值出现的次数,注意sum数组中的数可能会出现负数,于是要加上一个n防止访问负的下标。 最后用乘 阅读全文
posted @ 2018-01-23 20:34 TrassBlose 阅读(87) 评论(0) 推荐(0)
摘要:一道伟大的题。 阅读全文
posted @ 2018-01-23 19:55 TrassBlose 阅读(97) 评论(0) 推荐(0)
摘要:任何数都可用2的幂次方加和得到。 于是问题变成求2^k大于m的第一个k。 阅读全文
posted @ 2018-01-23 19:50 TrassBlose 阅读(77) 评论(0) 推荐(0)
摘要:最长公共子序列。 设f[i][j]为前第一个序列前i和第二个序列前j的最长公共子序列。 f[i][j]=f[i-1][j-1] (a[i]=b[j]) f[i][j]=max(f[i-1][j],f[i][j-1]) (a[i]!=b[j]) 阅读全文
posted @ 2018-01-23 16:00 TrassBlose 阅读(120) 评论(0) 推荐(0)
摘要:正反做两次最长上升子序列。 记f[i]为正着做以Ti为结尾的最长上升子序列。 记g[i]为倒着做以Ti为结尾的最长上升子序列。 答案就是n-max(f[i]+g[i]-1)。 阅读全文
posted @ 2018-01-23 15:02 TrassBlose 阅读(87) 评论(0) 推荐(0)
摘要:并查集模板,习惯并查集都加路径压缩优化。 阅读全文
posted @ 2018-01-22 18:30 TrassBlose 阅读(115) 评论(0) 推荐(0)
摘要:经典桶排题。 用一个桶记录某个数是否出现过。 或者使用C++自带的unique函数。 它需要先sort。 然后用此函数去重,返回的是去重后最后一个数的后面一位的地址。 阅读全文
posted @ 2018-01-22 17:14 TrassBlose 阅读(103) 评论(0) 推荐(0)
摘要:简单模拟。 阅读全文
posted @ 2018-01-22 17:04 TrassBlose 阅读(70) 评论(0) 推荐(0)
摘要:简单的深搜加上判断是否是质数。 由于是组合,所以要考虑顺序,不然会超时。 其实可以用状压的方法来递推。 f[i]表示状态为i时数的和是多少。 阅读全文
posted @ 2018-01-22 17:02 TrassBlose 阅读(112) 评论(0) 推荐(0)
摘要:首先用个桶统计一下每个数出现多少次。 然后用类似埃氏筛法的方法统计每个数有多少个倍数,对于存在每一种倍数个数的数取一个max。 最后递推一下答案即可。 阅读全文
posted @ 2018-01-22 16:36 TrassBlose 阅读(88) 评论(0) 推荐(0)
摘要:贪心,每次取最小的两个合并即可。 优先队列,懒惰就是美德。 单调队列,开两个队列,一个放没有合并过的果子堆,另一个放合并过的果子堆。 由于合并出来的果子堆是从小到大合并出来的,所以直接放队列尾部即可。 阅读全文
posted @ 2018-01-22 16:17 TrassBlose 阅读(97) 评论(0) 推荐(0)
摘要:一道伟大的题。 阅读全文
posted @ 2018-01-22 16:04 TrassBlose 阅读(106) 评论(0) 推荐(0)
摘要:直觉告诉我们答案就是[n/k]。 证明: 设答案为w,那么这些学号必然是w,w*2,w*3,w*4...w*k。 于是w*k当为不超过n的最大值,就可以得出w=[n/k]。 阅读全文
posted @ 2018-01-22 15:58 TrassBlose 阅读(125) 评论(0) 推荐(0)
摘要:求1~n这些数一共有多少个约数。 可以看做是求1~n这些数在1~n之间一共有多少个它的倍数。 数i在1~n之间有[n/i]个倍数。 阅读全文
posted @ 2018-01-22 15:49 TrassBlose 阅读(105) 评论(0) 推荐(0)
摘要:动态规划。 设f[i][j][k]为行列之和为i,第一条路到第j行,第二条路到第k行的方案数。 考虑每条路的下一步可以向下或向右,于是状态转移方程就出来了。 f[i][j][k]=max(f[i-1][j][k],f[i-1][j-1][k],f[i-1][j-1][k-1],f[i-1][j][k 阅读全文
posted @ 2018-01-21 20:31 TrassBlose 阅读(125) 评论(0) 推荐(0)
摘要:暴力,直接从1到n枚举一遍判断每一个数的每一位是否为x。 阅读全文
posted @ 2018-01-21 20:20 TrassBlose 阅读(108) 评论(0) 推荐(0)
摘要:无数书上都有介绍,不多说,模板题。 阅读全文
posted @ 2018-01-21 20:16 TrassBlose 阅读(119) 评论(0) 推荐(0)
摘要:简单的01背包。 阅读全文
posted @ 2018-01-21 20:14 TrassBlose 阅读(91) 评论(0) 推荐(0)
摘要:一道伟大的题。 阅读全文
posted @ 2018-01-21 20:12 TrassBlose 阅读(119) 评论(0) 推荐(0)
摘要:贪心,优先把人数大于r的组中的人分配给人数小于l的组。 所以只要求max(人数大于r的组中多出人数的总和,人数小于l的组中需要人数的总和)。 注意要判断是否可行。 阅读全文
posted @ 2018-01-21 20:10 TrassBlose 阅读(135) 评论(0) 推荐(0)
摘要:贪心,从前往后保证每一组的数总和都尽量大。 为了方便,考虑先加上当前位置的数:如果当前组的数总和已经超过了m,那么就把答案加一,重新开一个组给这个数。 阅读全文
posted @ 2018-01-21 19:52 TrassBlose 阅读(138) 评论(0) 推荐(0)