随笔分类 - 基本的算法概念
摘要:本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2527此题考查的是哈夫曼树,构造哈夫曼树并计算出最小编码数即可。做此题的过程中,提交之后竟然TLE,很是郁闷,找了几遍,还是没找出错误,可以肯定算法是不会错的,这方面不会超时,当测试只有一个字符的时候,发现问题了,出现了死循环,因为当只有1个或一种相同的字符的时候,并没有进行构造哈弗曼数的过程,因此在下面的找最小编码数的时候,出现了死循环,这个地方需要特殊计算最小编码数。改过之后,立刻就AC了,真是感慨,不过还挺满意的,自己构造出了哈夫曼树,继续加油!\(^o^)/~AC代码如下:#include&
阅读全文
posted @ 2012-05-05 00:30
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134此题考查的是卡特兰数,由于卡特兰数很大,所以考虑大数处理。卡特兰数的前几项为:h(0)=1;h(1)=1;h(2)=2;h(3)=5……卡特兰数的递推公式为:h(n)=h(n-1)*(4*n-2)/(n+1);非递推公式为C(2n,n)/(n+1);此题用递推公式求解,并用到大数的乘法和大数的乘法处理,本题对卡特兰数的前100项做了预处理:AC代码如下:#include<iostream> //卡特兰数求法 递推公式h(n)=h(n-1)*(4*n-2)/(n-1)using na
阅读全文
posted @ 2012-05-03 22:26
龙杉老师
摘要:有一块椭圆的地,你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段。它们最多能把土地分成多少个部分?解:最优方案是不让三条线段交与1点。欧拉公式:V-E+F=2.其中V是顶点(即所有线段的断点数加上交点数),E是边数(即n段椭圆弧加上这些线段被切成的段数),F是面数(即土地块数加上椭圆外那个无穷大的面)。换句话说,只需求出V和E,答案就是E-V+1;不管是定点还是边,计算时都要枚举一条从固定点出发(所以最后要乘以n)的所有对角线。假设该对角线左边有i个点,右边有n-2-i个点,则左右两边的点两两搭配后在这条对角线上形成了i*(n-2-i)个焦点,得到了i*(n-2-i)+1条线段。注
阅读全文
posted @ 2012-04-29 13:26
龙杉老师
摘要:果园里的树排列成矩阵。他们的x和y的坐标均是1~99的整数。输入若干个三角形,依次统计每个三角形内部和边界上共有多少棵树。输入:1.5 1.5 1.5 6.8 6.8 1.510.7 6.9 8.5 1.5 14.5 1.5此题用三角形有向面积来解,求有向面积2倍的函数为:double area(double x0,double y0,double x1,double y1,double x2,double,y2){ return x0*y1+x2*y0+x1*y2-x0*y2-x1*y0-x2*y1;}若求其面积,即没有方向的:则为fabs(S)/2;可以用行列式来记...
阅读全文
posted @ 2012-04-29 13:03
龙杉老师
摘要:二分法数学的魅力:幂运算满足结合律n为偶数: a^n=a^(n/2)*a^(n/2);n为奇数: a^n=a^(n/2)*a^(n/2)*a;保存a^(n/2),很容易求出a^n; 大数取模(a*b)%m=(a%m*b%m )%m;求(2^100000000000000)%10000;提示:二分法,速度惊人的快速幂!!!此题一般的数代码如下:#include<iostream>using namespace std;#include<math.h>__int64 fun(__int64 m,__int64 n,__int64 k){ __int64 s; if(n==1
阅读全文
posted @ 2012-04-25 23:52
龙杉老师
摘要:分治分治法是将一个规模为n的问题分解为k个规模较小的子问题。注意:这里的子问题一定是相互独立且与原问题相同。用递归的方法解这些子问题。然后将各子问题的解合并到原问题的解。二分查找算法是运用分治的典型例子分治-二分查找给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。分析据此容易设计出二分搜索算法:在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x, 找到x时返回其在数组中的位置,否则返回-1int binarySearch(int a[], int x, int n){ int left = 0; int right =
阅读全文
posted @ 2012-04-23 23:15
龙杉老师
摘要:小于x且与x互素的正整数的个数如果x为素数,则欧拉函数等于x-1求法:将x分解为p1^n1*p2^n2*…pk^nk,则欧拉函数=x*(1-1/p1)*(1-1/p2)…*(1-1/pk);代码如下:#include<iostream>using namespace std;#include<string.h>#include<math.h>#define M 10000int p[M],a[M+1],p1[M];void prime(){ memset(a,0,sizeof(a)); int i,j,k=0,m; m=(int)(sqrt(M*1.0));
阅读全文
posted @ 2012-04-21 15:47
龙杉老师
摘要:^^^转载请注明出处~~~The Sprague-Grundy theory of impartial games公平游戏的Sprague-Grundy定理公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法操作对双方来说都是相同的。一个公平游戏可以抽象地用一个有向无环图来表示,这个图中每个点都对应这一个状态,每条有向边代表从一个状态到另一个状态的合法操作。我们可以想象一个代币最初放在某个点上,然后两个玩家轮流将其从当前的点移动到它的后继点。当代币移动到汇点时游戏结束,汇点是一个没有出度的点,最后一个需要操作的玩家就是胜者。P- 和 N-状态如果双方都按照最佳策略进行游
阅读全文
posted @ 2012-04-21 09:58
龙杉老师
摘要:甲乙两人面对若干排石子,其中每一排石子的数目可以任意确定。例如图所示的初始局面:共n=3排,其中第一排的石子数a1=7,第二排石子数a2=3,第三排石子数a3=3。两人轮流按下列规则取走一些石子,游戏的规则如下:每一步必须从某一排中取走两枚石子;这两枚石子必须是紧紧挨着的;如果谁无法按规则取子,谁就是输家。 解:用符号#S,表示局面S所对应的二进制数。用符号$(x),表示局面(x)的下一步所有可能出现的局面的集合。定义集合g(x):设$(x)={S1, S2, …, Sk},则g(x)={#S1, #S2, …, #Sk}。函数f满足要求的一个充分条件f(a1)不属于集合g...
阅读全文
posted @ 2012-04-20 20:06
龙杉老师
摘要:11)哥德巴赫猜想: 一个大于等于4的偶数可以拆分为两个质数的和(用10e6内的数据测试一下):#include<iostream>using namespace std;#include<conio.h>#define M 1000000int p[M];bool is_prime(int n){ if(n<=1)return false; else for(int i=2;i*i<=n;i++) if(n%i==0)return false; return true;}int main(){ int n,i,j,k=0; for(i=2;...
阅读全文
posted @ 2012-04-20 13:25
龙杉老师
摘要:将一个整数n分解成x个正整数(a1+a2+a3+...+ax=n),使它们的乘积(a1*a2*a3*...*ax)最大。答案可能很大,输出对m取模后的结果。思路一:动态规划(DP)可以很容的思考出来动态转移方程用dp[i]代表当n=i的时候的最大乘积,于是:DP[i]=max(DP[i-j]*DP[j])动态规划的方法虽然可以解决该类问题,但是当n的值非常大的时候,dp数组都很难开的下,故不管是时间复杂度还是空间复杂度都高得惊人!于是需要新的思路。思路二:按照我们数学直觉,应该不难想到,分出来的这些a1,a2,a3…应该要相等才能让他们的积最大。/*小学的时候大家应该学过同
阅读全文
posted @ 2012-04-20 10:56
龙杉老师
摘要:对于一个B进制的数,只需要对其取以B的对数就可以得到他在B进制情况下的位数(取了对数之后可能为小数,所以还需要取整后再+1) N!的位数就是[lg(N!)]+1=[lg(1)+lg(2)+…+lg(N)]+1 =(int)ceil[(n*ln(n)-n+0.5*ln(2*n*π))/ln(10)]/*ceil是向上取整,[]符号为取整*/ 最后一个式子被称为斯特林公式例如:#include <iostream>using namespace std;#define pi 3.141592657#include<math.h>int main(){ int n;
阅读全文
posted @ 2012-04-19 23:55
龙杉老师
摘要:分解素因子(数论) Description 假设x是一个正整数,它的值不超过65535( 1< x <=65535 ),请编写一个程序,将x分解为若干个素数的乘积。 Input 输入的第一行含一个正整数k (1 <= k <= 65535 ),表示测试例的个数,后面紧接着k行,每行对应一个测试例,包含一个正整数x。Output 每个测试例对应一行输出,输出x的素数乘积表示式,式中的素数从小到大排列,两个素数之间用“*”表示乘法。 Sample Input 2 11 9828 Sample Output 11 2*2*3*3*3*7*13解:#inc
阅读全文
posted @ 2012-04-19 22:20
龙杉老师
摘要:母函数分为:普通型母函数,指数型母函数。普通型母函数主要是来求组合的方案数,而指数型母函数是求多重排列数。关于普通型母函数的讲解,以前写过:http://www.cnblogs.com/hsqdboke/archive/2012/04/17/2453677.html指数型母函数主要是关于排列组合方面的问题。分别看两个比较典型的问题对比:普通母函数问题:有红球两个,白球、黄球各一个,试求有多少种不同的组合方案。指数型母函数问题:假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次。从中取r个组合,求其排列数。下面是指数型母函数的定义:对于上面的问题“假设有8个元素,其中a1重复3次,a2
阅读全文
posted @ 2012-04-17 20:58
龙杉老师
摘要:母函数详解在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。这里先给出两句话,不懂的可以等看完这篇文章再回过头来看:1.“把组合问题的加法法则和幂级数的乘幂对应起来”2.“母函数的思想很简单 — 就...
阅读全文
posted @ 2012-04-17 15:04
龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~博弈论总结有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,
阅读全文
posted @ 2012-04-14 21:40
龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~A/B 扩展欧几里得算法Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Problem Description要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。Input数据的第一行是一个T,表示有T组数据。每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。Output对应每组数据输出(A/B)%
阅读全文
posted @ 2012-04-08 23:39
龙杉老师
摘要:qsort是C语言中用二分法进行的快速排序,其时间复杂度为n*log(n);库函数名为:#include<stdlib.h>基本形式为:qsort(a,n,sizeof(..),cmp);1:对整形数组排序例如a[5]={1,4,3,5,2};用函数qsort(a,5,sizeof(a[0]),cmp);其中cmp为 函数为cmp(const void *a,const void *b){return *(int *)a-*(int *)b;//要尽量强制转换类型}2:字符的排序其他和整形一样,函数为int cmp(const void *a,const void *b){retu
阅读全文
posted @ 2012-03-07 23:54
龙杉老师

浙公网安备 33010602011771号