ACM
文章平均质量分 62
总结以前做的题希望一起学习
成长的小牛233
一个很菜,仍然热爱技术热爱生活的程序猿
展开
-
赫夫曼编码长度计算问题?
网上例题:一组字符(a,b,c,d)在文中出现的次数分别为(7,6,3,5),字符'd'的哈夫曼编码的长度为?题解:首先构造huffman树每一步都将所有数字排序方法如下:1:3 5 6 72:6 7 8/ \3 53:8 13/ \ / \3 5 6 74:21/ \8 13/ \ / \3 5 6 7所以构造哈原创 2016-12-04 02:37:51 · 9701 阅读 · 0 评论 -
赫夫曼编码
http://blog.csdn.net/webzhuce/article/details/53105831原创 2016-12-04 02:04:10 · 348 阅读 · 0 评论 -
选择排序、插入排序、冒泡排序、快速排序、归并排序和希尔排序代码
#include<iostream>#include<algorithm>#include<ctime>using namespace std;#define random(a,b) (rand()%(b-a+1)+a)void print_array(int *a);void quick_sort(int *a, int l, int r){ ...原创 2018-07-05 13:29:47 · 259 阅读 · 0 评论 -
堆排序原理及算法实现(最大堆)
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>转载 2016-12-28 09:35:02 · 589 阅读 · 0 评论 -
归并排序的实现-代码
#include<stdio.h> void merge_sort(int *a,int *b,int x,int y) { if(y-x>1) { int m=x+(y-x)/2;//中间点的坐标 int p=x,q=m,i=x; merge_sort(a,b,x,m); ...原创 2016-11-19 19:47:09 · 383 阅读 · 0 评论 -
快速排序的实现--代码
#include int a[10000];void QickSort(int a[],int l,int r){ int temp; int i=l,j=r; if(l<r) { temp=a[l];//存val的值 while(i!=j) { while(j>i&&a[j]>temp)原创 2016-11-19 19:46:33 · 384 阅读 · 0 评论 -
qsort函数用法
qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针用于确定排序的顺序 排序方法有很多种, 选转载 2016-04-14 19:55:14 · 386 阅读 · 0 评论 -
递归算法的时间复杂度分析
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法: (1)代入法(Substitution Method) 代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。转载 2017-11-02 20:48:36 · 1393 阅读 · 0 评论 -
归并排序(视频+详解+代码)
归并排序概述:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[原创 2016-10-16 15:38:27 · 2759 阅读 · 1 评论 -
八皇后问题详解(最短代码)
八皇后问题算法分析:分析1:八皇后由一个64格的方块组成,那么把八个皇后放入不考虑其他情况利用穷举法,有8^64种可能。分析2:显然任意一行有且仅有1个皇后,使用数组queen[0->7]表示第i行的皇后位于哪一列。对于“1->8”这八个字符,调用全排列问题(有8!种情况,虽然数字很大但是比分析1已经大大缩短了时间),并且加入分支限界的条件判断是否相互攻击即可。分析2=3:原创 2016-10-11 20:28:28 · 16146 阅读 · 0 评论 -
给定n个整数,从中选出1个或多个,使选出整数的乘积是完全平方数。一共有多少种选法? 例如,{4,6,10,15}有3种4、6、10、15和4、6、10、15。
#include #include int wanquan(int n){ __int64 num; num=sqrt(n); double x=sqrt(n); if(num-x==0) return 1; else return 0;}int main(){ int n,count=0; __转载 2016-08-14 17:15:48 · 1856 阅读 · 0 评论 -
DP为王——动态规划法学习笔记
动态规划英文名Dynamic Programming,这个名称总让人有一种时曾相识的感觉,可能是因为容易和“线性规划”之类的概念搞混。 首先,适用动态规划的问题十分广泛和常见——地图路径搜索(深度优先、广度优先、A*),填充容器使价值最大化(例如背包体积固定V,有不同的物体具有各自的体积和价值),文本比较算法(常用的diff工具),以及最短路径之类的求最优解的问题转载 2016-08-01 10:25:25 · 1010 阅读 · 0 评论 -
C语言实现大数据除法
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。输入格式:输入在1行中依次给出A和B,中间以1空格分隔。输出格式:在1行中依次输出Q和R,中间以1空格分隔。输入样例: 123456789050987654321 7 输出样例: 176366841501410934转载 2016-07-29 16:00:33 · 1895 阅读 · 0 评论 -
容斥原理 和 欧拉函数
在概率论中,对于概率空间中的事件A1,……,An,当n = 2时容斥原理的公式为:当n = 3时,公式为:一般地:正数n的唯一素因子分解式=p1^a1 * p2^a2 * p3^a3 ……* pk^ak 。求1,2,3,…… n中与n互素的个数。φ(n)=n(1 - 1/p1) (1 - 1/p2) (1 - 1/p3)转载 2016-07-15 08:36:35 · 978 阅读 · 0 评论 -
平衡二叉树模板
#include #include #include #include using namespace std;struct node{ int ndata; //记录关键字数值 node *l,*r; int nheight; //平衡因子};int height(node* p) //返回树p的深原创 2016-12-21 07:43:42 · 708 阅读 · 0 评论 -
DFS全排列
第一种方法:package com.tjrac_java_2;import java.util.Scanner;public class Fun { public static int s=0; static int[] a=new int[100000]; public static void main(String[] args) { int...原创 2018-03-30 18:59:25 · 251 阅读 · 0 评论 -
扩展的欧几里得算法
任务:求出A,B的最大公约数,且求出X,Y满足AX+BY=GCD(A,B).模板代码:int extendGcd(int a,int b,int &x,int &y){ if(!b) { x=1; y=0; return a; } else { int r=extendGcd(b,a%b,y,x); y-=x*(a/b); return r;原创 2016-10-06 16:07:52 · 302 阅读 · 0 评论 -
Stein算法(求两个数最大公约数)
欧几里德算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的。但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来。考虑现在的硬件平台,一般整数最多也就是64位,对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就原创 2016-10-06 16:39:17 · 850 阅读 · 0 评论 -
中国剩余定理(模板+代码)
#include#include using namespace std;//扩展欧几里得算法int exgcd(int a,int b,int &x,int &y){ int d; if(b==0) { x=1;y=0; return a; } d=exgcd(b,a%b,y,x); y-=a/b*x;原创 2016-10-06 16:47:14 · 3328 阅读 · 2 评论 -
平方剩余(例题+详解+代码模板)
平方剩余 (poj 1808)题意:判断平方剩余,即判断(x^2)%p=a是否有解。限制:|a| 思路:用欧拉准则计算勒让德符号(用来判断平方剩余)/*poj 1808 题意: 判断平方剩余,即判断(x^2)%p=a是否有解。 限制: |a| <= 1e9 && a % p !=0; 2 < p < 1e9 && p为奇素数。原创 2016-10-06 17:07:29 · 4355 阅读 · 0 评论 -
【计算几何】线段相交
问题描述:已知两条线段P1P2和Q1Q2,判断P1P2和Q1Q2是否相交,若相交,求出交点。两条线段的位置关系可以分为三类:有重合部分、无重合部分但有交点、无交点。算法的步骤如下:1.快速排斥实验。设以线段P1P2为对角线的矩形为R,设以线段Q1Q2为对角线的矩形为T,如果R和T不相交,则两线段不相交。2.跨立实验。如果两线段相交,则两线段必然相互跨立对方。若P1P2跨转载 2016-04-17 20:07:15 · 1131 阅读 · 0 评论 -
向量的叉积
向量的叉积性质都忘完了……但是它可以用来判断点在直线的某侧。进而可以解决点是否在三角形内,两个矩形是否重叠等问题。向量的叉积的模表示这两个向量围成的平行四边形的面积。 设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P×Q = x1*y2 - x2*y1,其结果是一个伪矢量。原创 2016-04-17 21:28:54 · 691 阅读 · 0 评论 -
欧几里得算法
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }原创 2016-10-06 16:03:16 · 274 阅读 · 0 评论 -
三种方法求最长子序列问题
#include#includeusing namespace std;int maxsum(int a[],int x,int y){ int v,l,r; if(y-x==1)//只有一个元素,直接返回 return a[x]; int m=x+(y-x)/2;//分治法第一步,划分成[x,m)和[m,y) int maxs=max(maxsum(a,x,m),maxsu原创 2016-10-16 13:46:28 · 773 阅读 · 0 评论 -
全排列算法解析(视频+详解+代码+STL)
全排列生成算法刚开始自学的时候搜了两三个scdn中关于讲解全排列问题的博客,但是我理解能力比较差还是没有完全理解,后来就在网上搜索了视频才完全弄懂,现在把我理解的分享给你们。学习视频:http://v.ku6.com/show/RP7r6vew4Qb_MCF1eYZeOg...html1、 没有重复字符的全排列问题例如:对abcd进行全排列如图:分析:a b c d1、 定a 对b c d进行...原创 2016-10-09 16:58:42 · 3677 阅读 · 5 评论 -
数值方法求积分 详解+模板代码
什么是数值积分 数值积分可以用来求定积分的近似值。对于很多函数来说,我们是可以使用初等函数来表示出其积分的,对于这种函数,只需要求出不定积分然后代入值就能得到定积分了。 可是除此之外还有许多难求的函数和没法使用初等函数表示的函数。当我们想要求出它们的定积分的时候,需要使用数值积分来求解。 在ACM中一些题目需要使用数值积分来求解,以下列出一些求数值积分的方法,由简单到难,而对转载 2016-10-07 09:40:22 · 6442 阅读 · 0 评论 -
Mobius函数计算 定义+代码模板
定义编辑f(n)和g(n)是定义在正整数集合上的两个函数,若 则 反之亦然。 其中 μ(d)=1, 若d=偶数个不同素数之积 μ(d)=(-1)r, 若d=奇数个不同素数之积 μ(d)=0, 其他例如:μ( 30) = μ( 2·3·5 ) = (-1)3μ(12) = μ( 3·22) = 0原创 2016-10-07 09:04:30 · 1736 阅读 · 0 评论 -
素数筛选法(模板)
#include <stdio.h>#include <string.h>#include <math.h>#define MAX 1000000int is_prime[MAX+5] = {1}; //is_prime[i]是素数为1,不是素数为0int prime_num[MAX]; //prime_num[i]是第i个素数...原创 2016-10-06 17:31:47 · 541 阅读 · 0 评论 -
N次剩余(详解+例题+代码)
从《国际大学生程序设计大赛算法与实现》中所学任务:给定N, a, p, 求出(x^N)%p=a 在模p意义下的所有解x。说明:令g为p的原根,因为p为素数,所以phi(p)=p-1。由原根的性质得:如果g为p的原根,则:g^i mod p != g^j mod p (p为素数), 其中i != j且i, j介於1至(p-1)之间所以,可以设g^y=x, g^t=a,原创 2016-10-06 17:28:28 · 5828 阅读 · 0 评论 -
离散对数(例题+详解+代码模板)
题意:给定x,n,m,求x^y=n(mod m)的解(其中m是素数)求解一个最小的x满足给定的方程Bx == N (mod P)使用baby_step_giant_step算法。也就是先小步后大步算法。1、令x=i*m+j (m=ceil(sqrt(p))),那么原式化为 B^(i*m)*B^j==N(MOD P)B^j==N*B^(-i*原创 2016-10-06 17:18:50 · 2963 阅读 · 1 评论 -
原根(详解+代码实现+例题+快速求解一个数的原根)
1.原根定义假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1简单来说,g^i mod p ≠ g^j mod p (p为素数)其中i≠j且i, j介於1至(p-1)之间则g为p的原根。 简单的来说,如果g是P的原根,那么g的(1...P-1)次幂mod P的结果一定互不相同。 那么简化一下:首先看一下欧拉定理:欧拉定理(也转载 2016-10-06 16:59:25 · 12521 阅读 · 0 评论 -
中国剩余问题(简介+详解)
中国剩余定理 我国古代数学名著《孙子算经》载有一道数学问题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?”这里的几何指多少的意思。翻译成数学语言就是:求正整数N,使N除以3余2,除以5余3,除以7余2。 如何求符合上述条件的正整数N呢?《孙子算经》给出了一个非常有效的巧妙解法。术曰:“三、三数之剩二,置一百四十;五、五数之剩三,置六十三原创 2016-10-06 16:41:36 · 8331 阅读 · 0 评论 -
SPFA总结
动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。#include #include #include #define inf 1using nam原创 2016-05-22 16:56:04 · 382 阅读 · 0 评论 -
蓝桥杯-方格填数
方格填数如下的10个格子 +–+–+–+ | | | | +–+–+–+–+ | | | | | +–+–+–+–+ | | | | +–+–+–+(如果显示有问题,也可以参看【图1.jpg】)填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻)一共有多少种可能的填数方案?请填写表示方案数目的整数。 注...原创 2018-03-29 11:51:34 · 326 阅读 · 0 评论 -
还是畅通工程(克鲁斯卡尔算法+并查集)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 53997 Accepted Submission(s): 24504Problem Description某省调查乡村交通状况,得到的统计表中列出了任意两村...原创 2018-03-31 20:53:52 · 558 阅读 · 0 评论 -
最小生成树的Prime算法的思想
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C.转载 2016-05-08 16:13:21 · 2408 阅读 · 0 评论 -
还是畅通工程(思想+代码)
Description某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );原创 2016-05-08 11:06:52 · 1083 阅读 · 0 评论 -
最小生成树(普利姆算法、克鲁斯卡尔算法)
给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树.求最小生成树的算法(1) 克鲁斯卡尔算法图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间.(2) 普里姆算法图的存贮结构采用邻接矩阵.此方法是按各个顶点连通的步骤进行,需要用一个顶点集合,开始为空集,以后将以连通的顶点转载 2016-05-06 20:06:31 · 634 阅读 · 0 评论 -
题目1335:闯迷宫( BFS在求解最短路径或者最短步数上有很多的应用)
题目描述:sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。输入:输入有原创 2016-04-12 18:28:12 · 2635 阅读 · 0 评论 -
邻接表存储图利用BFS遍历
//今天上机写的邻接表存储图利用BFS遍历:#include#include#include#includeusing namespace std;struct node//存节点所连接的点{ int id; node *next;};struct list//存各个节点的顶点值{ int data; node *first;}AdjList[原创 2016-12-12 19:07:06 · 613 阅读 · 0 评论