- 博客(13)
- 资源 (1)
- 收藏
- 关注
原创 哈夫曼编码压缩解压缩实现&不同类型文件压缩比的测试
压缩原理及步骤&&压缩比的计算压缩原理及步骤压缩的第一步: 将一个文件以各个字符出现的次数为权值建立哈夫曼树,这样每个字符可以用从树根到该字符所在到叶子节点的路径来表示。(左为0,右为1)压缩第二步: 哈夫曼编码有一个很重要的特性:每个字符编码不会成为另一个编码的前缀。这个特性保证了即使我们把不同长度的编码存在一起,仍然也可以把它们分离开,不会出现认错人的冲突。 那么我们就可以把所有
2015-12-30 01:01:53 15519 2
原创 C++实现大数除法
题外话 大数除法无疑是大数操作里最麻烦的一项,写大数不实现除法无异于画龙无鳞。思路 最原始的,脑子最容易冒出来的思路,是一下一下的减,看能累计减多少次,最后的总次数就是结果,但这样的效率实在太慢。但我们可以一次性减去 除数的1,10,100,1000倍,只要它在当前倍数下比被除数小。 例如 1210 3 ,121大于300,我们直接剪去300,给结果加100,这样的话,减的次数会大
2015-12-25 16:09:56 11672 3
原创 c++实现大数乘法
思路 第i位数乘第j位数,乘积是第i+j位数(从0开始) 如123*456 乘积各位数为 个位 3*6 十位 2*6 + 3*5 百位 2*5 + 1*6 + 3*4 千位 1*5 + 2*4 万位 1*4然后从后往前,取余更新。代码#include <stdio.h>#include <iostream>#include <vector>
2015-12-22 00:51:44 8369
原创 c++实现大数加法(含负数)
题外话 一直想好好的把所有大数操作好好敲一遍,都止于惰性,碰到一个要用到大数的题,索性就由此开始吧。 大数加法写过太多次了,含负数的第一次写,用运算符重载的形式实现,挺有意思。思路 当两数符号相同时,相加即可,重点内容结果符号不变。 不同时,需要对两数的绝对值进行比较,结果符号与绝对值大的数符号相同,然后用大的减去小的。代码#include <stdio.h>#includ
2015-12-21 23:11:10 6344 4
原创 51Nod 1454 升排列
1454 升排列题目来源: CodeForces基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注定义长度为n的排列为数组 p = [p1, p2, ..., pn] ,这个数组包含n个整数,他们都在1到n之间,并且两两不同。我们说这个排列把1映射到 p1 ,2映射到 p2 ,依此类推。下面介绍一下排列的循环表示。一个环是一串数字,这一串数字中每一个数字被映射到下一个数字,最后一个数字被映射到第一个数字。排列p的循环表示是由一系列的环构成的。比如排列p
2015-12-21 18:48:59 1012 1
原创 51Nod 1191 消灭兔子 (贪心+优先队列)
题目链接:消灭兔子题目大意 n个兔子,每个兔子都有一个血量b[i] m种箭(每种各一支),每种箭都有伤害值d[i]和价格p[i] 每个兔子只能被射一次,伤害值大于血量则死,每种箭只能用一次 问杀死所有兔子需要的最小价格为多少,若不能杀死,则No Solution m,n小于50000)思路 典型的贪心,每个兔子只能射一次,所以只能用伤害值大于其血量的箭,在此前提下,
2015-12-18 16:43:22 1219
原创 51Nod 1163 最高的奖励(贪心+优先队列 & 并差集)
题目链接:最高的奖励题目大意 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。 Input 第1行:一个数N,表示任务的数量(2 <= N <= 50000) 第2 - N + 1行,每行
2015-12-18 03:55:12 1103
原创 UVA - 10384 推门游戏(IDA*+剪枝)
题目链接 题意 求最少需要几次乘除法可以从x得到x^n?思路 也就是求1经过最少加减可以得出n 序列初始只有1,每次选任意两数进行加减,加入序列 使用IDA*迭代加深搜索剪枝条件 当前序列最大值*(2^max-步数) < n 即后边步数一直按最快的求法仍然比n小优化方案 1.迭代的max值不从1开始,而是从log(n)开始 2.每次只对最大值进行加
2015-12-17 17:28:16 1317 1
原创 UVA - 1374 Power Calculus(IDA*+剪枝)
题目链接 题意 求最少需要几次乘除法可以从x得到x^n?思路 也就是求1经过最少加减可以得出n 序列初始只有1,每次选任意两数进行加减,加入序列 使用IDA*迭代加深搜索剪枝条件 当前序列最大值*(2^max-步数) < n 即后边步数一直按最快的求法仍然比n小优化方案 1.迭代的max值不从1开始,而是从log(n)开始 2.每次只对最大值进行加
2015-12-16 05:04:19 809
原创 51Nod 1376 最长递增子序列的数量(dp+树状数组)
题目链接最长递增子序列的题做个不少,让求数量的第一次做,O(n^2)的代码很好写,但数据范围50000,故无情超时,想了很久,总算有所得。时间: O(nlog(n)) 空间: O(2*n)思路 O(n^2)的思路中,每次求以第i个数结尾的最大长度和记录总数都要对前i-1个数进行遍历比较,如果能把这个比较过程转化为对前i项对求和,就可以用树状数组或线段数进行求和优化了。 重载+,按照题目需
2015-12-16 03:38:13 1910 2
原创 初学A*算法求解静态地图的最短路径
以前所接触过的最短路径算法是dijkstra或floyd之类的,都是在已知每两点之间距离的情况下求最短路的。那么想一下这样的案例 给你一个地图,类似于迷宫一样,中间有些障碍物,再给定起点终点,求该两点间最短路,显然,上述两种算法就不适用了,因为提到的迷宫,我们可能会很容易想到广搜bfs,但一次bfs下来实际上求出了起点到所有点的最短路径,但我们只想知道它与终点间的最短路径,也就是说这个方案里有很
2015-12-07 04:13:08 7876
原创 51Nod 1022 石子归并 V2 (划分型dp四边形不等式优化)
石子归并以前做过好几次,是经典划分型dp题之一,一直用的O(n3)的正常dp方法,也从未想过该怎么去优化它。直到昨天做这道题,n的范围由往常的100改为了1000,老方法一直超时,苦不堪言,搜到有个四边形不等式的优化方法,看帖子,画式子,拉着学长帮忙推导,总算是大概弄明白了一点。dp(i,j) = min(dp(i,k)+dp(k+1,j)) + w(i,j);(i < j, i
2015-12-03 03:34:46 2288
原创 51Nod 1459 迷宫游戏
题目链接:迷宫游戏题目 你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、分数、起点和终点等全部信息,你能计算在尽快
2015-12-01 03:02:47 1743
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人