12 2014 档案
摘要:这道题是个dp,主要考虑两种情况,刚开始我把状态转移方程写成了dp[i] = min(dp[i-1] + a, dp[i + 1] +b); 后来想想当推到dp[i]的时候,那个dp[i + 1]还没有推出来,所以这种方式推导出来不对,后来又看到dp[i] = min(dp[i-2]的所有情况最小值...
阅读全文
摘要:这个题都说是水题,楞是没做出来,看了好多题解,感觉这个规律没看懂,后来在讨论区看到了一个题解,感觉有点懂了,写一下自己的理解首先要明白异或的意思,简单一句话: 同0异1,既然这样,让求区间a,b 中异或最大的一个,那么最大的一组是多少呢,多谢几组数据,先求出来 a ^ b的值,因为这是求最大的基础,...
阅读全文
摘要:这道题和求字段和的要求就差一点,就是那个是一条链, 这个是个环,关于这么环,刚开始按照链那种方式推倒状态转移方程,但是没有写出来,后来看题解,才看到原来还是转化为普通的单链来做,好多题都是由不会的转化成简单的来做的。还得多思考啊,碰见题就不想动脑子,真是什么都学不了啊思路:一共有2种,首先是求单链最...
阅读全文
摘要:我看了好多博客,都是拿一维的做基础,一维的比较简单,所以要把二维的化成一维的,一维的题目大意:给了一个序列,求那个子序列的和最大,这时候就可以用dp来做,首先dp[i]表示第i个数能构成的最大子序列和,所以dp[i] = dp[i - 1] > 0 ? dp[i - 1] + dp[i] : dp[...
阅读全文
摘要:这道题看了好大会没有思路,上网一搜发现这么简单,但是我为什么就想不到呢,??就是求和它的逆序之后的字符串最长公共子序列,然后用总的长度减去它就行了。原因是是因为只要是在公共子序列里面,那么他就是对称的,少的那些就是需要补的代码如下: 1 #include 2 #include 3 #include ...
阅读全文
摘要:这道题有个小技巧,就是既然是n!,那么对2009求余,只要大于2009!,那么一定是0,在仔细想想会发现,根本到不了2009,只要到2009的最大质因数就行了,为什么呢?因为最大质因数是最大的一个不能被2009整除的,2009的最大质因数是41,也就是只要大于41的阶乘的都可以整除2009,因为41...
阅读全文
摘要:这道题有个小小的坎,就是低于5块不能选,大于5块,可以任意选,所以就在初始条件判断一下剩余钱数,然后如果大于5的话,这时候就要用到贪心的思想,只要大于等于5,先找最大的那个,然后剩下的再去用背包去选择,这样的结果一定是最优的。因为最大的那个一定会被选中,剩下多少钱都无所谓,用背包可以获得剩下的最优解...
阅读全文
摘要:这道题乍一看是普通的01背包,最最基础的,但是仔细一看数据,发现普通的根本没法做,仔细观察数组发现n比较小,利用这个特点将它划分为前半部分和后半部分这样就好了,当时在网上找题解,找不到,后来在挑战程序设计上找到了这个题,就拿来引用一下挑选物品的方法总从2^n中,直接枚举肯定不行,因为n最大为40,但...
阅读全文
摘要:当时做这道题时一直想退出物理公式来,但是后来推到导数那一部分,由于数学不好,没有推出来那个关于Θ的最值,后来直接暴力了,很明显超时了,忘了三分法的应用,这道题又是典型的三分求最值,是个单峰曲线,下面是代码 1 #include 2 #include 3 #define PI 3.1415926 ...
阅读全文
摘要:printf是格式化输出函数,它可以直接打印十进制,八进制,十六进制,输出控制符分别为%d, %o, %x, 但是它不存在二进制,如果输出二进制,可以手写,但是也可以调用stdlib.h里面的itoa函数,他不是标准库里面的函数,但是大多数编译器里面都有这个函数,所以就介绍一下itoa函数的原型为c...
阅读全文
摘要:这道题其实和一般的01背包没有什么区别,只是这道题目按照正常的思维去做不行了,因为容量太大,开个10^9的数组开不了,所以这时候就需要换种思维,这个题刚开始没理解,后来在网上在题解,发现都说是互换重量和价值,但是一直没理解什么意思,后来,仔细想了想那个最最基础的01背包是怎么推出来的才想通了, 也不...
阅读全文
摘要:这道题是典型的多重背包的题目,也是最基础的多重背包的题目题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就是dp[i] = i, 其中dp[i]表示当前背包容量为i 的时候背包能装的价值。题目思路: 模板 二...
阅读全文
摘要:这两道题都是多重背包的基础题,前面的安格题意是:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B,就类似于NYOJ上的那个邮票分你一半那个意思,只不过这里不是一个而是多个,所以多重背包前一个题是将总和的一半当作背包的容量来求,代码如下 1 #include 2 ...
阅读全文
摘要:这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销2. 物品单项的报销额不超过6003. 每个发票总额不超过1000有了这三个,还有一个要小心的就是报销额可以为浮点数,所以这里有个小...
阅读全文
摘要:这个是完全背包的基础题, 模拟换钱, 刚开始状态方程写错了,我直接写dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3], 然后想了想感觉太大了,不太对,后来看网上的代码看着两层for循环,基本是一样的,为什么我的不对啊,然后手工模拟了一个小例子,发现,这种状态转移方程...
阅读全文
摘要:找规律题,这种题目比较巧妙,要仔细观察找出规律1. 假设只有一行,一共有n列,那么由一个小矩形构成的矩形个数为n, 由两个小矩形构成的矩形个数为 n - 1个 .... 由 n 个小矩形构成的矩形个数为1个,所以所有的矩形个数就是n + (n - 1) + (n - 2) + ...+ 2 + 1 ...
阅读全文
摘要:这道题是刚好装满的背包问题,刚好选取k个,状态转移方程为dp[i][j] = max( dp[i - 1][j], dp[i - 1][j - 1] + Li - Bi(j - 1) )dp[i][j] 表示从前 i 个男孩中选取 j 个的 Li 的最大值, 首先按照Bi 排一下序,这个是利用贪心的...
阅读全文
摘要:主元素这个问题,有个nlogn的算法,但是还有比它更快的,有O(n)的算法,基本思想是,从头到尾遍历,先将第一个元素保存到一个变量中,然后依次往后遍历,每遍历到与它的值相同的元素时,就要将它的个数+1,不同时-1,这样是因为如果存在主元素,那么主元素的个数一定是大于n/2的,所以最后这样抵消下来剩下...
阅读全文
摘要:此题可以找到规律f(n) = 1! * 2! *...*n!,如果直接打表的话,由于n比较大(10000000),所以会超内存,这时候就要用到离线处理数据,就是先把数据存起来,到最后在暴力一遍求解就行了,代码如下代码一(超内存): 1 #include 2 3 const long long m...
阅读全文
摘要:这个问题直接用4个while循环就可以写出来,注意一下边界处理就行了 1 #include 2 #include 3 int a[103][103]; 4 int main() 5 { 6 int n; 7 while(~scanf("%d", &n)) 8 { 9 ...
阅读全文
摘要:这个辗转相除由于当时不太理解,所以在一次测试的时候有忘了,当时凭着印象算推,算写,花了20分钟大概才写出来额,浪费了赛场上宝贵的20分钟啊,以此当个教训,学过的东西不能只是做过一遍就完事了,要彻底吃透才行,昨天考试考的很差劲,也是这段时间太贪玩的结果吧,感觉题考的很基础,就是写不出来,还是没有真正的...
阅读全文

浙公网安备 33010602011771号