代码改变世界

浅谈快速求逆序对

2012-11-07 13:09 by kliner, 439 阅读, 1 推荐, 收藏, 编辑
摘要:利用树状数组(有时是线段树,有时利用单调队列)可将某些特定问题的时间中的"N"的一维降为"lgN"的一维 阅读全文

动态规划天天练1

2012-10-31 15:53 by kliner, 243 阅读, 0 推荐, 收藏, 编辑
摘要:本来很久以前就打算每天练一道动态规划题的,但每每由于作业太多而中断,现在终于停课了......废话不多说,第一道题就给了我迎头一棒,不仅想了很久,连题解都看了很久。。。水平相当不足啊啊,不多说废话,先上题吧。 题目大意:给你一个只包含数字的字符串,让你在中间添加k个乘号,使得添加完后的字串按乘号划分出的k+1个部分相乘,除以一个定值s的余数为指定的值,在这种约束下,最小化k的值。 输入:第一行一个数字串,第二行一个数s。 输出:最小的k值。 数值范围:数字串长度L<=1000,s<=50。 思路:首先想到“乘积最大”这道题目,在“乘积最大”中,令f[i][j]为前i个数添加j个乘号 阅读全文

tyvj P1125题解

2012-10-16 20:14 by kliner, 216 阅读, 0 推荐, 收藏, 编辑
摘要:题目大意:第一行输入N与K,N<=100,K<50。 第二行输入N个数(每个数均小于等于50)。 目标,从这N个数中选一部分数配成K+3对,代价为每对N之差的平方和,要求代价最小值。 输出:一个值,代表最小代价 思路:一看到这个题,便知道应用动规,然而若直接用动规的话会有后效性(最后一个不知道和谁配对),想到每个数应与自己最相近的数配对。于是将这N个数从小到大排序,对于每个数,要么不选它,要么将它与它的前一个数配对。动态转移方程:f[i][j]=min{f[i][j-1],f[i-1][j-2]+(L[j]-L[j-1])^2};以下贴出代码: 1 #include <iostream& 阅读全文

总结排列组合在OI中的应用

2012-10-12 19:07 by kliner, 598 阅读, 1 推荐, 收藏, 编辑
摘要:排列组合的思想是每一位OIer都必须掌握的技能,并且不仅要掌握高中课本所学的内容,更应该学会用递推的思想解决一些我们现在的知识不能直接解决的排列组合的问题。接下来是几个不同的经典“盒子与球”问题。e.g 1:有m个相同的球,n个不同的盒子,将球放入盒子中且不允许有空的方法为多少?解答:采用高中数学的插板法即可解决。总方法数为C(m-1,n-1)。e.g 2:主干与例1相同,只是改为允许有空。解答:将m个球上加上n个球,问题即变为m+n个球放入n个盒子且不允许盒子有空的方法。注意这里的化归思想。e.g 3:将m个不同的球放入n个相同的盒子且不允许有空的方法?解答:适用于第二类斯特林数。令f[i] 阅读全文

利用单调队列优化动态规划

2012-10-12 19:05 by kliner, 490 阅读, 0 推荐, 收藏, 编辑
摘要:可用单调队列优化的动规有一大类题型,它们多半都有一个特征:可以化归为序列中定长区间的最值问题。注意这里必须是定长区间,否则应用RMQ算法。下面举一个例子:输入:第一行两个正整数N(N<=600000),M。接下来一行N个数。输出:对于每个区间[i,i-M+1],输出其中的最小值。思路:很显然这道题数据大到不允许利用RMQ的各种O(NlogN)的算法,想到每一次找最小值都只是将上一个区间后移一个数,即这个区间的答案很有可能可从上个区间获得,于是保持一个单调队列,区间每后移一次,就将num[i]插入队尾,若队尾的数Q[k]大于等于当前的数(num[i]),就说明Q[k]在以后就不可能是一个可 阅读全文

NOI导刊2008模拟9—赛马 解题报告

2012-10-12 19:02 by kliner, 276 阅读, 0 推荐, 收藏, 编辑
摘要:题目大意:田忌与齐威王赛马,现给出一个正整数N表示两人各有N匹马,接下来第2-3行,每行N个整数,第二行表示齐威王每匹马的速度,第三行表示田忌每匹马的速度。已知田忌赢一局得1块钱,平局不得钱,输一局失去1块钱,安排一个策略使田忌赢钱最多。(N>=5000)输出:一行,一个整数,为田忌最多可赢的钱数。思路:首先将齐威王与田忌的马均按速度从大到小排列,由于齐威王的出马顺序并不影响田忌赢的最多钱数,因此可以假设齐王从大到小开始出马。因此,田忌可有以下策略:1.当自己最强的马都比不赢齐威王当前的马时,取自己最弱的马与之进行比赛,这是显然的。2.当自己最强的马可以比过当前齐威王的马时,干掉它。这条 阅读全文

NOI导刊模拟2—电话网络 解题报告

2012-10-12 18:56 by kliner, 204 阅读, 0 推荐, 收藏, 编辑
摘要:noi导刊模拟2题解 阅读全文

任务调度问题1—贪心算法

2012-10-12 18:50 by kliner, 7999 阅读, 0 推荐, 收藏, 编辑
摘要:这个问题是《算法导论》上的一个经典的贪心算法问题——单处理器上具有期限和惩罚的单位时间任务调度问题,目标是使惩罚最小。输入:第一行一个数n,接下来第2行到第n+1行,第i行分别是d[i]和w[i],其中d[i]表示第i个任务的时限,w[i]表示第i个任务的惩罚,每个任务的完成时间为单位时间。输出:一行一个数,为最小惩罚。题解:令集合S为所有任务的集合,A为一个任务集合,其中所有的任务满足条件:存在某种调配方式,使得所有任务能在期限前完成,又令l为所有A集合的集合。可以证明,序对M=(S,l)是一个拟阵,于是,可以采用贪心算法解决它。同时,一个任务集合R属于l,当且仅当它满足下列条件:R中在期限 阅读全文

NOI导刊2008第十套trans 结题报告

2012-10-11 19:08 by kliner, 318 阅读, 1 推荐, 收藏, 编辑
摘要:题目大意:对于由某个从A到Z所有字符不重不漏构成的字符串,如HRSLCZDKIYXUNOMTGVJEFAWBPQ,这表示把'A'置换为'H',把'B'置换为'R'......把'Z'置换为'Q'。现在我们把这个置换进行两次从而得到一个新的置换。你的任务是判断一个字串是否是由一个置换操作两次得到的新的置换。输入:一个由'A'到'Z'不重不漏组成的字符串。输出:若这个字串是否是由一个置换操作两次得到的新的置换,输出"Yes",反之,输出"No 阅读全文