[ CodeVS冲杯之路 ] P1166】的更多相关文章

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1166/ 有许久没有刷题了,忙着过中秋去了嘿嘿 首先它的每一行是独立的,我们可以直接把它拆分成 n 互不相关的子问题做 那么就变成了区间 DP 问题,f[i][j] 表示在区间 [i,j] 内的最大分数,首先枚举区间长度 k,然后再枚举左端点 i   n 表示的是一行数的个数 注意 k 要到-1,是因为 f[i][i] 时还有一个 a[i] 没有取走,目标状态是 max ( f[i][i-1] ) ,(i=1~n)…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/5853381.html 这边博客讲得很好啊,虽然不是这道题,但是方法是完全类似的 你把田忌赛马看懂了,泡泡堂就自然解出来了 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath>…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树上DP,设f[i][j]为以 i 为根 j 为子树的最小的那一天 注意DP方程是有单调性的,可以用动态仙人掌维护,最后答案容斥一下即可 目测代码量8k+ #include<cstdio> #include<algorithm> using namespace std; int main…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好啊,交给他吧 http://www.cnblogs.com/Booble/archive/2010/11/27/1889482.html #include<cstdio> #include<cstdlib> #include<cstring> #include<cma…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节很多,幸好样例给的良心,可以检测出很多细节 自己字符串模拟即可,一定要细心! #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream>…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' ,找到最多的和最小的(注意判0) 再根号 n 地判断质数即可 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #includ…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入最后是没有回车的,导致WA烂啊…… 给你两个串,它们每个字母有一一对应的关系,如果遇到不同字母对应相同的就 Failed 或者相同字母对应不同字母也 Failed,如果最后 'A'-'Z' 其中有没有对应的还是 Failed 直接开 255 的数组,(其实也可以只开26个)相当于 26 个关键字的哈…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密钥的映射,如果小于 a 或 A 则再将它加上 26 即可 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木板和木材都是从小到大开始选,然后要保证剩余的木材最少 那么将木板和木材排序,对于每个木材,把能够分的小木板尽量分掉,如果遇到更大的木板则把最小的木板腾出来,然后在加上,这样保证剩余的木材最少 因为是上午写得这道题,思路可能不连贯了,代码应该描述的很清楚 虽然贪心在CodeVS上可以过,但是它是有数据…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2952/ 题目讲一个细胞可分裂成 2 个,那么当前数目就是2a,a 为时间 然后 q 个细胞一起会死亡,也就是对 q 取模 数据范围很大,要用快速幂(位运算无法取模会炸) 坚持手打快速幂!快速幂原理在下面: http://www.cnblogs.com/hadilo/p/5719139.html #include<cstdio> #include<cstdlib> #include<cstring…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1091/ 大家都写的 DFS,然而我想到了一种贪心的做法,重点是可以A 普遍的贪心是每次删掉该深度子树最大的点,但是如果有一边卡一条链就会WA 我们何不进一步考虑贪心,如果它下面是一条链我们就可以缓一缓到第 2 天再删是不是,反正它每次也就增加一个人 用 size[x] 记录所有后代加上自己的节点个数,f[x] 记录其最大子树的 size 值 我们考虑第一次不删这个节点,让它先扩展一次,然后第二次再删除它子树中 si…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1169/ 感觉这题目好恐怖,莫名其妙乱码一堆就AC了…… 它看上去是两个子问题,实际上可以看成从起点找两条不相交的路径使得经过的数和最大 用 f[i][j][k][l] 表示第一条走到了 (i,j) 第二条走到了 (k,l) 目标状态是 f[n][m-1][n-1][m] 一开始我也没仔细去想,就莫名其妙码了一堆交上去了,本以为会WA,结果A了?! 后面我仔细证明了一下,它是这样的 首先 l 是从 j+1 开始的,这…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1116/ 数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色 这里我使用了一个优化,在读入的时候将相邻的点压入数组,这样在判断的时候时间就小于O(n) 不过这个优化好像没有不回溯的方法好,然而并没有写不回溯的 #include<algorithm> #include<iostream> #include<cstdlib> #include<…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1295/ 数据很小,直接DFS,加上剪枝 剪枝其实就是判重,首先深度是行下标,这里自带不重复,枚举的列下标,用 f 记录每一列是否用过 斜着的用下标相加减控制,如下图 x 为横坐标,y 为纵坐标 对于每根红线,x+y 相等 对于每根蓝线,n-x-y 相等 我们就用 g 表示一条红线是否用过,y 表示一条蓝线是否用过 #include<cstdio> #include<cstdlib> #include&…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1294/ 随手一打就是这么漂亮的全排列,想当年我初一还是初二的时候,调了1个多小时才写出来(蒟蒻一枚) 直接DFS每次枚举当前数字,记得判断是否重复,取完后打上标记并保存当前位置的数,最后到n+1层时打出来 因为极限数据的方案比较多,所以可以加上输出优化,不过不加也不会TL 上面那个是加了读入优化的,快了将近3倍 #include<cstdio> #include<cstdlib> #include&l…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3117/ 啊啊啊,基础的高精度乘法被我写得又臭又长,以后再来优化代码(DP着哪天能够把加减乘除全部写一边贴上来,哦对还有开根) 这里依然使用的是模拟手算 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmat…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3115/ 基础的高精度减法,先判断一下被减数是否小于减数,若是则交换位置,打上 “-” 负号 当然也可以用压位做 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespac…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1039/ 一道赤裸裸的嘲讽型数学题,推出来的话算法代码就3行,没有推出来连暴力都无从入手…… 设 f(n,m) 为整数 n 拆分成 m 个数字的方案数,那么分以下两种情况讨论 1° 不选 1 的情况 如果不选择 1,我们把 n 拆分成 m 块时可以看做先将每一块加上个 1,则 n 还剩余 n-m,即 f(n-m,m) 2° 选 1 的情况 那么就直接选一个 1,即 f(n-1,m-1),因为是递归的方法,所以选择 1…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1017/ 看到题目最下面有一个喜人的提示 那这就意味着我们不用写高精度了是不是,直接开 long long 存 设 f[i][j] 表示第 i 个乘号放在第 j 个位置(显然一共有 n-1 个位置) 其中 n 表示数字个数,m 表示需要加上的乘号个数 初始状态 f[1][i]=a[1][i]*a[i+1][n]   i=1~n-1 a[i][j] 是原数区间 [i,j] 内的数,当 i=j 时 a[i][j] 易得,…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1220/ 一个标准的DAG上的DP,设 f[i][j] 为在第 i 行第 j 最大分数 因为这个状态是无后效性的,所以可以直接在读入的时候用原数组转移 目标状态是 max(f[n][i] )  i=1~n #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<c…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1010/ 首先我们将坐标都+1,因为它是从(0,0)开始的 预处理出禁区,也就是马能到达的格子和马自己的格子,标上记号 直接开始转移   把 f[0][1] 或者 f[1][0] 赋上1,这样 f[1][1] 就能正常转移 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include&l…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1154/ 由于所有珠子连成一个环,所以要进行预处理,直接将整个值往后复制 n 位,即 a[i+n]=a[i] 设 f[i][j] 为区间 [i,j] 中的最大能量,显然,当复制完后从 2~n-1 能够涵盖所有的情况 这里特别要注意边界,我们发现 f[1][k] 和 f[k][2*n] (k=1~2*n) 是没有意义的,因为在此情况下不存在 a[0] 和 a[n*2+1],这种情况已经变到了 f[n+1][k] 与 f…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1048/ 区间DP题,设 f[i][j] 为在区间 [i,j] 中合并的最小代价 目标状态是 f[1][n],末尾的求和公式可以用前缀和来优化 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm>…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1063/ 本来是想写石子合并的,结果把题目看错了,写成了合并果子…… 凑合交了上去,直接A了…… 题目将可以将任意两堆合并,只要要求两堆数量和最小,那么考虑贪心,用堆维护,时间复杂度降为 O(nlog2n) 维护一个小根堆,每次将堆顶和儿子中较小的那个合并,更新答案 #include<algorithm> #include<iostream> #include<cstdlib> #inclu…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3027/ 显然是DP题,先按线段的右端点升序排序 设 f[i] 为dp到第 i 个线段时最大的价值 目标状态为 max(f[i]) #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #defi…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3116/ 基础的高精度加法,注意一下两个数长短不一和答案第一位的处理即可,当然也可以用压位的方法做 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #define N 501 using n…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1576/ 这和上一道题十分的类似,所以直接秒杀 ( 上一题:http://www.cnblogs.com/hadilo/p/5865216.html ) 设 f[i] 为在第 i 个数字时 最长上升序列的个数 目标状态为 max(f[i]) #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1044/ 机房连续断网,搞得现在才能上博客…… 很经典的DP题,把问题转换一下就是分别求最不降序列和最长上升序列 f[i][j] 表示可以选择多少个,第一问 目标状态是 max(f[i]) 第二问同理,仅仅是把条件的符号换了一下 目标状态也是 max(f[i]) #include<algorithm> #include<iostream> #include<cstdlib> #include…
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1068/ 这是一道神DP题,一开始状态设计错了,用位置和剩余卡片做下标,过了样例数据WA了 好了,讲正解,设 f[i][j][k][l] 为1卡牌用了 i 次,2卡牌用了 j 次,3卡牌用了 k 次,4卡牌用了 l 次 那么转移:   这里 c 数组存的是对应的卡牌一共有多少张,末状态是 f[c[1]][c[2]][c[3]][c[4]] 时间复杂度: #include<algorithm> #include<…